可能重复:
为什么要使用两个堆栈来建立队列?
我得到了这个赋值问题,要求我使用两个堆栈实现一个队列。我的问题不是如何做到,而是为什么这样做?我不是来自计算机背景,我试图找到答案,但无法真正找到原因吗?我认为你的专家可以帮助我理解实现这样的事情有什么好处。我找到了一篇相关的文章 为什么要使用两个堆栈来建立队列? 谈论这个,但想知道是否还有更多。
可能重复:
为什么要使用两个堆栈来建立队列?
我得到了这个赋值问题,要求我使用两个堆栈实现一个队列。我的问题不是如何做到,而是为什么这样做?我不是来自计算机背景,我试图找到答案,但无法真正找到原因吗?我认为你的专家可以帮助我理解实现这样的事情有什么好处。我找到了一篇相关的文章 为什么要使用两个堆栈来建立队列? 谈论这个,但想知道是否还有更多。
这样做有几个很好的理由。
首先,一些函数式编程语言(如Haskell,ML或Lisp)支持列表作为内置类型。列表通常表示为单个前向链接列表,这意味着它们支持O(1)前置但O(n)连接。在这样的语言中,制作一个堆栈非常容易 - 你只需要一个列表就可以将第一个元素推送到pop中。由于内部实现,这在O(1)时间内运行。如果您尝试使用此类列表创建队列,则enqueue将花费O(n)时间,因为您必须添加到单个链接列表的末尾,该列表不存储指向最后一个元素的指针。另一方面,如果使用两个堆栈(或更多堆栈)实现队列 胡德 - 梅尔维尔队列 使用六个!),然后即使你只有你的语言堆栈,你也可以分摊O(1)入队和出队。尽管已经设计了更高级的数据结构来支持纯功能队列和列表(例如 2-3指树),双堆栈结构在许多应用中仍然非常有用。
除此之外,在某些情况下,您可能希望使用特殊堆栈来实现队列以获得额外的功能。例如,你可以 增加堆栈数据结构 支持O(1)find-min / find-max。如果你有这样的堆栈,那么你可以 使用双栈结构来创建一个也具有O(1)find-min / find-max的队列。试图直接解决这个问题要困难得多(看看我的 更复杂的建筑 使用这些属性创建队列!)
最后,从理论角度来看,知道可以使用两个堆栈模拟队列是很有趣的。在可计算性理论中,a 双栈下推自动机 是一种理论计算设备,功率相当于图灵机。一个 队列自动机 是一个类似的结构,它使用队列而不是两个堆栈。因为我们知道您可以模拟具有两个堆栈的队列,所以您可以立即证明队列自动机至少与图灵机一样强大,因此队列自动机是图灵完备的。
希望这可以帮助!