将值从队列移动到堆栈

时间:2012-10-07 23:53:29

标签: python abstract-data-type

如果我想将一个值从一个队列移动到一个堆栈(值应该不再在队列中,只在堆栈中),我是否需要在将它推入堆栈之前将其出列,或者将其推送到堆栈中堆栈会自动出列吗?

2 个答案:

答案 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)

您描述的第二个设计基本上意味着一个项目只能同时在一个集合中。使用起来相当尴尬。通常,集合(堆栈和队列)应该能够存储任何类型的对象而不会影响对象的状态。

所以,是的,对于任何合理的队列和/或堆栈实现,将一个项目添加到一个项目中不会将其从后者中删除。