当然没有什么能阻止你实现这样一个野兽。
例如,当您将一个元素添加到当前为空的集合中,或者当项目仍以递增顺序进入时,您只需将项目添加到 堆栈。
但是,如果您在任何时候添加一个优先级小于的项目,只需将所有堆栈条目移动到一个空队列(在下面所有提到的队列中,我的意思是优先级queue) 在幕后,在最后将您的新项目添加到该队列之前。
清空队列后,您将再次恢复为默认堆栈。
所以,基本上,伪代码是这样的。一、实例变量:
class uberqueue:
lastPrio = 0
stack = []
prioq = []
然后是执行上述操作的put 函数:
def put (item):
# Empty, use stack.
if stack.size() == 0 and prioq.size() == 0:
stack.push(item)
lastPrio = item.prio
return
# Stacking and in order, add to stack.
if stack.size() > 0 and item.prio >= lastPrio:
stack.push(item)
lastPrio = item.prio
return
# Stacking and out of order, transfer stack to queue.
while stack.size() > 0:
prioq.put(stock.pop())
# Queueing, add to queue.
prioq.put(item)
最后,get 函数仅从当前活动的底层结构(堆栈或队列)中获取项目:
def get():
# Just get from whatever underlying structure is in use.
if stack.size() > 0:
return stack.pop()
return prioq.get()
而且,如果您遵循优先级排序准则,您就有了一个数据结构,它可以为您提供 O(1) 的插入/检索性能,否则会恢复到优先级队列性能。
事实上,如果堆栈和队列都提供查看下一个项目优先级的能力,您甚至可以完全摆脱堆栈到队列的传输。
这样做的一种方法是当项目的优先级大于或等于顶部元素的优先级时将项目放入堆栈。这样可以确保堆栈中的所有项目都正确排序。所有乱序的项目都直接进入优先队列。
get 功能必须稍作更改,查看堆栈和队列以查看哪个具有最高优先级,然后提取那个。
这有点棘手,但在某些情况下可能会提供优势。