如果我想将一个值从一个队列移动到一个堆栈(值应该不再在队列中,只在堆栈中),我是否需要在将它推入堆栈之前将其出列,或者将其推送到堆栈中堆栈会自动出列吗?
答案 0 :(得分:1)
如果您的实现是标准队列和堆栈,那么您需要将其出列以将其从队列中删除。单独推送到另一个堆栈的操作不会将其从队列中删除。但是,为了获得价值,您已经可能已经将其取代了。
例如,如果您使用的是Queue
python模块,那么Queue.get()
将删除并从队列中返回一个项目。但是这个动作与将值推送到堆栈无关。
使用来自deque
的双端队列collections
的示例:
>>> stack = [1,2,3]
>>> stack
[1, 2, 3]
>>> from collections import deque
>>> queue = deque(['foo', 'bar', 'baz'])
>>> queue.append('one')
>>> queue.append('two')
>>> stack.append('foo')
>>> stack
[1, 2, 3, 'foo']
>>> queue
deque(['foo', 'bar', 'baz', 'one', 'two'])
请注意,只是向堆栈添加相同的值对包含'foo
的队列没有任何影响。 (即使id('foo')
可能是相同的!)
但是,从队列中显式弹出foo
会将其从队列中删除:
>>> stack.append(queue.popleft())
>>> queue
deque(['bar', 'baz', 'one', 'two'])
>>> stack
[1, 2, 3, 'foo']
答案 1 :(得分:0)
您描述的第二个设计基本上意味着一个项目只能同时在一个集合中。使用起来相当尴尬。通常,集合(堆栈和队列)应该能够存储任何类型的对象而不会影响对象的状态。
所以,是的,对于任何合理的队列和/或堆栈实现,将一个项目添加到一个项目中不会将其从后者中删除。