Data structures 为什么我们让元素从堆栈2推回堆栈1

Data structures 为什么我们让元素从堆栈2推回堆栈1,data-structures,stack,queue,Data Structures,Stack,Queue,最近,我遇到了一个关于如何使用2个堆栈构建队列的算法,如下所示: 方法1(通过增加排队操作的成本): 此方法确保最早输入的元素始终位于堆栈1的顶部,以便从堆栈1弹出出列操作。要将元素放置在stack1的顶部,使用stack2 enQueue(q, x) 1) While stack1 is not empty, push everything from stack1 to stack2. 2) Push x to stack1 (assuming size of stacks is un

最近,我遇到了一个关于如何使用2个堆栈构建队列的算法,如下所示:

方法1(通过增加排队操作的成本): 此方法确保最早输入的元素始终位于堆栈1的顶部,以便从堆栈1弹出出列操作。要将元素放置在stack1的顶部,使用stack2

enQueue(q, x)
  1) While stack1 is not empty, push everything from stack1 to stack2.
  2) Push x to stack1 (assuming size of stacks is unlimited).
  3) Push everything back to stack1.
Here time complexity will be O(n)


deQueue(q)
  1) If stack1 is empty then error
  2) Pop an item from stack1 and return it
Here time complexity will be O(1)

现在这个算法是有意义的,除了第三点关于为什么我们要把所有东西都推回到堆栈1上。为什么我们不能使用堆栈2作为队列(在排队操作期间)

为什么所有内容都被推回到堆栈1上

这是由以下事实驱动的:当您执行出列操作时,会从堆栈1中弹出一个元素

假设您有三个相同顺序的推送操作x1、x2、x3。由于出列操作总是从stack1开始,因此必须确保x1位于顶部,x2位于第二位,x3位于第三位。这只能通过第三点来确保

在算法中,您前面提到的入队和出队都是在stack1上执行的

为什么我们不能使用堆栈2作为队列(在排队操作期间)

在这种情况下,您必须对堆栈1执行出列操作

排队(q,x):

  • 推到堆栈2。O(1)
  • 出列(q):

  • 如果stack1不为空,则从stack1弹出
  • 如果stack1为空

    2.1如果stack2也为空,则抛出一个错误

    2.2将所有从stack2转移到stack1。现在从stack1中弹出顶部。 出列的摊销复杂度将为O(1),因为传输的元素数等于stack1中弹出的元素数


  • 为什么stack1上的所有内容都被推后

    这是由以下事实驱动的:当您执行出列操作时,会从堆栈1中弹出一个元素

    假设您有三个相同顺序的推送操作x1、x2、x3。由于出列操作总是从stack1开始,因此必须确保x1位于顶部,x2位于第二位,x3位于第三位。这只能通过第三点来确保

    在算法中,您前面提到的入队和出队都是在stack1上执行的

    为什么我们不能使用堆栈2作为队列(在排队操作期间)

    在这种情况下,您必须对堆栈1执行出列操作

    排队(q,x):

  • 推到堆栈2。O(1)
  • 出列(q):

  • 如果stack1不为空,则从stack1弹出
  • 如果stack1为空

    2.1如果stack2也为空,则抛出一个错误

    2.2将所有从stack2转移到stack1。现在从stack1中弹出顶部。 出列的摊销复杂度将为O(1),因为传输的元素数等于stack1中弹出的元素数


  • 请在你遇到算法之前告诉我们更多关于这一段的信息。它说什么?我已经在编辑中证明了算法。donPablo的意思是你需要告诉我们更多关于算法的信息,因为这取决于使用情况。这个例子可能显示了使用股票创建队列的成本有多高。只有两个操作主要由堆栈实现提供,即pop和push。时间复杂度表示为O(n)。是的,队列结构会更容易/更快,但本例尝试仅使用堆栈。stack2不是一个队列,没有任何其他操作。这通常是一个代码访问问题。请在您遇到算法之前告诉我们有关该段落的更多信息。它说什么?我已经在编辑中证明了算法。donPablo的意思是你需要告诉我们更多关于算法的信息,因为这取决于使用情况。这个例子可能显示了使用股票创建队列的成本有多高。只有两个操作主要由堆栈实现提供,即pop和push。时间复杂度表示为O(n)。是的,队列结构会更容易/更快,但本例尝试仅使用堆栈。stack2不是队列,没有任何其他操作。这通常是一个代码访问问题。