用最大堆实现最大优先队列(Python)
程序员文章站
2022-03-31 19:08:06
...
'''
优先队列:优先队列是根据堆来实现的
最大优先队列根据最大堆实现
本程序以最大优先队列为例
堆是存放在数组中的,当元素数量超过数组长度时需要进行扩容
'''
class PrioriityQueue:
def __init__(self):
self.array=[]
self.size=0
def enqueue(self,element):
self.array.append(element)
self.size += 1
self.up_adjust() # 调用类内函数,需要加self
def dequeue(self):
if self.size<0:
raise Exception('队列为空')
head=self.array[0]
self.array[0]=self.array[self.size-1]
self.array.pop() # 一定记得加上这一句,要不然原数组是不会变的
self.size -= 1
self.down_adjust()
return head
def up_adjust(self):
child_index=self.size-1
parent_index=(child_index-1)//2
temp=self.array[child_index]
while child_index>0 and temp>self.array[parent_index]:
self.array[child_index]=self.array[parent_index]
child_index=parent_index
parent_index=(child_index-1)//2
self.array[child_index]=temp
def down_adjust(self):
parent_index=0
temp=self.array[parent_index]
child_index=1
while child_index<self.size:
if child_index+1<self.size and self.array[child_index]<self.array[child_index+1]:
child_index += 1
if temp>self.array[child_index]:
break
self.array[parent_index]=self.array[child_index]
parent_index=child_index
child_index=2*parent_index+1
self.array[parent_index]=temp
def printList(self):
print(self.array)
queue=PrioriityQueue()
queue.enqueue(3)
queue.enqueue(6)
queue.enqueue(2)
queue.enqueue(8)
queue.enqueue(4)
queue.printList()
print(queue.dequeue())
queue.printList()
print(queue.dequeue())
queue.printList()
queue.enqueue(1)
queue.printList()
print(queue.dequeue())
queue.printList()