欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用最大堆实现最大优先队列(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()

用最大堆实现最大优先队列(Python)