1

编辑

I would disagree that this is a duplicate, I am not asking for the best way to implement them, my questions below are asking for clarity on the how many ways are there to define them as well as asking for an example of when this would be thought of and used in a work setting.(即可以定义为对象?)

我正在阅读课程中的一段,需要澄清这一点:

堆栈数据结构实现了一个 LIFO 优先级集合。它提供了这两个功能:push 和 pop。push 将一个元素添加到堆栈的顶部,并且 pop 删除最顶部的元素。

我被给了这个例子given a string, reverse it using a stack

代码

我举了一个例子:

let word = 'Bloc';

const reverseString = (str) => {

  let stack = [];

  for (let i of str) {

      stack.push(str[i]);

  }

  let reversed = '';

  for (let i of word) {

      reversed += stack.pop();

  }

  return reversed;

 }

console.log(reverseString('Bloc'));
  1. 当您定义堆栈或使用堆栈时,array, linked lists, and as a class您可以定义堆栈的唯一方法是什么?

  2. 在工作环境中考虑和使用这一点的频率是多少?当有人正在构建应用程序并考虑使用它时,是否有一个简单的例子。

  3. 在我在顶部给出的段落中,它说它提供了 2 个功能,push and pop这自动意味着arrayarray methods对吗?除了定义堆栈的其他方法之外,这些是否会被视为额外功能?

4

2 回答 2

1

有许多不同的方法可以模仿堆栈,但最终它们都归结为 JavaScript 对象的变体。JavaScript 没有内置的堆栈、队列或链接列表等结构。即使是数组也是一种对象形式,还有一些额外的方法。Javascript 的原型继承使您能够模仿这些结构并形成对象变体。一个模仿堆栈的简单示例是使用构造函数,它使用自己的方法生成一个对象:

function Stack() {
  return {
    items: [],
    push: function ( item ) {
      this.items[this.items.length] = item;
    }
    pop: function () {
      const topItem = this.items[this.items.length - 1];
      this.items.length = this.items.length - 1;
      return topItem;
    }
  }
}      

但是,您可能永远不会在 Javascript 中真正模仿这样的堆栈。通常,您只需像上面那样使用数组方法。堆栈如何工作的想法很重要

例如,假设您获得了一组数据,其中包括用户在您网站上的开始时间和结束时间,按开始时间(例如[[02:30, 03:00][02:45, 3:15][4:00, 5:30][5:00, 6:00])排序,并且您的工作是显示用户在您网站上的时间图表网站,而不是您的网站。查看间隙并使其保持有序的一种解决方案是合并重叠间隔(示例变为[[2:30, 3:15][4:00, 6:00]])。

您可以通过将第一项推入堆栈来使用“堆栈”执行此操作,并将其与集合中的下一个间隔进行比较。如果它没有重叠,您只需将该项目推入堆栈,但如果它确实重叠,您会将其从堆栈中弹出,合并两者,然后将其推回堆栈以进行比较下一项。

所以是的,在 JavaScript 中,您可能仍会为此使用数组,但集成了堆栈结构的思想。如果您开始使用其他语言(通常是 Java 或 C++ 等静态语言),它们将具有内置的堆栈、队列、链接列表等,因此了解它们的工作方式以及每种语言的优缺点/用例非常重要他们。

于 2019-06-06T00:20:59.133 回答
1

简而言之 -stack只是一种数据结构,用于解决不同语言、系统、库等的特定问题。

  1. 如果我们专门讨论 javascript,那么我会说您列出的方式(数组、链表、作为一个类)都是构建堆栈的良好开端。但是,它们都只是您试图用来构建另一个数据结构的数据结构。您构建的任何类型stack都是为特定目的而构建的,并且具有不同的属性。例如,您可以随时限制堆栈中的元素数量(例如 - 堆栈中的最大元素数量为 4,然后当您尝试将第 5 个元素添加到堆栈中时 - 它将达到stack overflow而不是让你这样做)。您还可以限制其中的数据类型。这完全取决于该堆栈的目的是什么。数组是可视化堆栈的好方法,也是构建堆栈的绝佳起点,因为它们已经为您提供了像堆栈一样操作自己的方法(pushpop)。但是您不需要使用数组,您可以使用objects并找到使用它们的方法。世界是你的牡蛎 :)
  2. 我个人并不经常在我的工作场所构建堆栈(我是一名 Web 开发人员)。但是,了解和理解它是一个重要的数据结构。如果您要在一个进行大量数据操作的环境中工作 - 您也会偶尔编写自己的堆栈实现。一些js库有自己的堆栈实现,如果您要构建它们 - 那么您应该了解它是如何工作的!如果您将使用图形和图形数据 - 堆栈理解是必不可少的。再说一遍 - 这完全取决于您的工作场所对数据聚合和数据处理的重视程度。
  3. pushpopin jsare for Arrays,这是正确的。我想说这两个函数是堆栈的重要组成部分,因为它们为您提供了堆栈操作的基本方法。但是,这两种方法并不是完全定义的,可以添加更多方法。

希望能帮助到你。祝你好运!

于 2019-06-05T23:43:52.790 回答