如何使用优先级队列实现堆栈?
How to implement a stack using a priority queue?
优先级队列用于实现存储字符的栈。
Push(C)
用于实现 Insert(Q,C,K)
,其中 K
是实现选择的适当键。
Pop
实现为 Delete_Min(Q)
,对于必须按什么顺序选择键的操作序列,严格递减或严格递增?
首先要说的是,优先队列和栈是两种完全不同的数据结构,有着不同的用途和应用。一个不能总是用来实现另一个。
是的,在某些情况下,可以根据另一个数据结构来定义数据结构:例如,您可以使用链表创建堆栈或队列(实际上非常简单),但是使用优先级队列实现堆栈将并不总是有效。为什么?
因为栈是先进后出的。您压入堆栈的最后一件事将最先弹出。堆栈的唯一工作是保持压入项的顺序不变,并以相反的顺序弹出。
然而,优先级队列总是会给你最小值(或基于实现的最大值)弹出。根据定义,优先级队列必须重新构造自身以始终保持 "heap property"。这意味着您推送的原始顺序不一定会保留。
现在,您的问题应表述为 "In what situation will a priority queue and a stack behave the same way?"
您提到您的优先级队列 pop()
将从您的队列中删除最小值,这表明您手头有一个 min-heap。在这种情况下,优先级队列中的一系列弹出与堆栈中的弹出类似的唯一情况是,所有项都按 non-increasing 顺序推送。它不必严格递减。 (考虑推动所有相同的价值观)。
优先级队列用于实现存储字符的栈。
Push(C)
用于实现 Insert(Q,C,K)
,其中 K
是实现选择的适当键。
Pop
实现为 Delete_Min(Q)
,对于必须按什么顺序选择键的操作序列,严格递减或严格递增?
首先要说的是,优先队列和栈是两种完全不同的数据结构,有着不同的用途和应用。一个不能总是用来实现另一个。
是的,在某些情况下,可以根据另一个数据结构来定义数据结构:例如,您可以使用链表创建堆栈或队列(实际上非常简单),但是使用优先级队列实现堆栈将并不总是有效。为什么?
因为栈是先进后出的。您压入堆栈的最后一件事将最先弹出。堆栈的唯一工作是保持压入项的顺序不变,并以相反的顺序弹出。
然而,优先级队列总是会给你最小值(或基于实现的最大值)弹出。根据定义,优先级队列必须重新构造自身以始终保持 "heap property"。这意味着您推送的原始顺序不一定会保留。
现在,您的问题应表述为 "In what situation will a priority queue and a stack behave the same way?"
您提到您的优先级队列 pop()
将从您的队列中删除最小值,这表明您手头有一个 min-heap。在这种情况下,优先级队列中的一系列弹出与堆栈中的弹出类似的唯一情况是,所有项都按 non-increasing 顺序推送。它不必严格递减。 (考虑推动所有相同的价值观)。