堆栈使用两个队列

时间:2010-08-19 02:06:14

标签: data-structures

  

可能重复:
  Implement Stack using Two Queues

我想要在时间复杂度方面使用两个队列实现堆栈的最有效方式

3 个答案:

答案 0 :(得分:5)

我不明白为什么你需要两个队列。我已经在这里和欺骗线程中看到了答案,你只需要一个队列即可。

从欺骗线程中,它有两个版本,一个优化推送,另一个优化pop。

推送优化:

push:  
    enqueue in queue  
pop:  
    n = queue size.
    dequeue an object, and enqueue it immediately after. Do this n - 1 times.
    dequeue object, and return this.

Pop优化:

push:
    enqueue in queue
    n = queue size.
    dequeue an object, and enqueue it immediately after. Do this n - 1 times.
pop:
    dequeue from queue and return.

然后,我不明白为什么你曾经想要这样做。责备你的教授,让你浪费时间编写毫无意义的编程问题。

答案 1 :(得分:2)

我可能错了,但对我来说这不算。

队列(通常)是FIFO结构,堆栈是LIFO结构。我无法摆脱我的脑海,设想任何可以产生LIFO的2个FIFO的简单组合,尽管我今天可能还没有足够的咖啡。

这可能是可能的,但我怀疑涉及2个队列的堆栈的实现几乎肯定需要更长的时间来实现,并且比简单的堆栈实现更容易出错。

然而,说过......

如果你已经有了Queue实现,并且该Queue允许你从它的TAIL而不是HEAD中删除项目(实际条款可能在你的实现中有所不同)那么你可以简单地使用Queue就好像它是堆栈一样从TAIL中检索项目。

答案 2 :(得分:2)

很简单, 假设您有队列A和队列B.  你使用一个队列来保存数据,而另一个队列作为临时容器......但是A和B一直在互换角色:

首次插入数据时,会插入到队列A中。 要弹出您插入的最后一个项目,您可以删除除最后一个元素之外的所有队列A元素,并在队列B中对它们进行ENQUEUE。 DEQUEUE队列A中唯一的元素,你有你想要的东西:堆栈的顶部,最后一个元素......等等......

现在要POP最新项目,你重新做同样的工作,但A和B交换角色