我想要在时间复杂度方面使用两个队列实现堆栈的最有效方式
答案 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交换角色