最近,我遇到了一种有关如何使用2个堆栈构建队列的算法,如下所示:
方法1(通过增加enQueue操作的成本): 此方法确保输入的最旧元素始终位于堆栈1的顶部,以便deQueue操作仅从stack1弹出。要将元素放置在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用作队列(在入队操作期间)
答案 0 :(得分:2)
为什么所有内容都被推回stack1
这是由以下事实造成的:执行出队操作时,会从堆栈1中弹出一个元素。
假设您有三个推操作x1,x2,x3顺序相同。由于出栈操作始终在stack1上进行,因此必须确保x1在顶部,x2在第二位,x3在第三位。这只能通过第三点来确保。
在算法中,您已经提到了入栈和出队都在stack1上执行。
为什么我们不能将堆栈2用作队列(入队操作期间)
在这种情况下,您将必须在堆栈1上执行出队操作。
排队(q,x):
deQueue(q):
如果stack1为空
2.1如果stack2也为空,则引发错误。
2.2将所有内容从堆栈2传输到堆栈1。现在从stack1弹出顶部。 出队的摊销复杂度将为O(1),因为传输的元素数等于从stack1弹出的元素数。