【问题标题】:Moving a value from a queue to a stack [closed]将值从队列移动到堆栈[关闭]
【发布时间】:2012-10-07 23:53:29
【问题描述】:

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

【问题讨论】:

    标签: python abstract-data-type


    【解决方案1】:

    如果您的实现是标准队列和堆栈,那么您需要将其出列以将其从队列中移除。单独推入另一个堆栈的操作不会将其从队列中删除。但是,首先要获得该值,您可能已经将其出列。

    例如,如果您使用Queue python 模块,那么Queue.get() 将删除从队列中返回一个项目。但是这个动作独立于将值压入堆栈。


    使用来自collections 的双端队列deque 的示例:

    >>> 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']
    

    【讨论】:

    • 感谢您的回答,这有助于澄清我对这两个 ADT 的不确定性。 :)
    【解决方案2】:

    您描述的第二种设计基本上意味着一件物品只能同时出现在一个收藏中。这将是相当尴尬的使用。一般来说,集合(栈和队列就是)应该能够存储任何类型的对象而不影响对象的状态。

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

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 2013-05-26
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多