【问题标题】:How to implement a stack using a priority queue?如何使用优先级队列实现堆栈?
【发布时间】:2016-01-27 17:02:54
【问题描述】:

优先级队列用于实现存储字符的堆栈。

Push(C) 用于实现Insert(Q,C,K),其中K 是实现选择的适当密钥。

Pop 实现为Delete_Min(Q),对于一系列操作,必须按照什么顺序选择键,严格递减还是严格递增?

【问题讨论】:

    标签: data-structures stack priority-queue abstract-data-type


    【解决方案1】:

    首先我要说,优先级队列和堆栈是两种完全不同的数据结构,具有不同的用途和应用。一个不能总是用来实现另一个。

    是的,在某些情况下可以根据另一个数据结构来定义数据结构:例如,您可以使用链表创建堆栈或队列(实际上非​​常简单),但是使用优先级队列实现堆栈并不总是工作。为什么?

    因为堆栈是先进后出的。你压入堆栈的最后一件事将是第一个弹出的东西。堆栈的唯一工作是保持推送项目的顺序完整并以相反的顺序弹出。

    然而,优先级队列总是会给你一个弹出的最小值(或基于实现的最大值)。根据定义,优先级队列必须重新构建自身以始终保持“堆属性”。这意味着不一定会保留您推送的原始顺序。

    现在,您的问题应该表述为“在什么情况下优先级队列和堆栈的行为方式相同?”

    您提到您的优先级队列pop() 将从您的队列中删除最小值,这表明您手头有一个最小堆。在这种情况下,优先级队列中的一系列弹出类似于堆栈中的弹出的唯一情况是,当项目全部以非递增顺序推送时。它不必严格减少。 (考虑推动所有相同的值)。

    【讨论】:

    • 但是如果键相同,那么我们也必须考虑这种情况,因此键必须严格按照降序排列
    • 如果所有的键都是同一个栈,优先队列的行为也一样,所以我不明白为什么它必须严格递减
    • 如果所有键都相同,则 PQ 的顺序未定义。和栈不一样。 PQ 可以表现得像堆栈的唯一方法是键是否适当地单调递增或递减。敲碎一个坚果需要一把锤子。
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 2013-11-30
    • 2011-06-09
    • 1970-01-01
    • 2018-12-24
    • 2014-01-19
    • 2021-12-20
    相关资源
    最近更新 更多