优先队列代码实现

文章目录

  • 优先队列
  • 一、功能
    • 1.优先队列元素放入
    • 2.取出第一个元素查看
    • 3.删除第一个元素
    • 4.判断是否为空以及获取队列的长度
  • 总结

一、优先队列

通过优先级的不同来排队的队列叫做优先队列,在现实中可以参照医生优先处理病情严重的患者,以及飞机经济舱头等舱排队

代码如下(示例):


class person:
    def __init__(self,name):
        self.name=name
class priority_queue() : #优先列
    __data = []
    def enqueue(self,item,prior):
          dic={}
          dic["prior"]=prior
          dic["value"]=item
          flag=True
          for index in range(len(self.__data)):  #有元素时,根据优先级进行插入
             if  self.__data[index].get("prior")>=prior :
                   self.__data.insert(index,dic)
                   flag=False
                   break                    #需要终止,以免多次循环,导致size()计数变多
          else:
              if flag or len(self.__data)==0:
                 self.__data.append(dic)

    def front(self):
        if len(self.__data)==0:
                 return None
        return self.__data[-1].get("value")

    def dequeue(self):
            if len(self.__data) == 0:
                return None
            return self.__data.pop().get("value")

    def is__empty(self):
        return len(self.__data)==0
    def __len__(self):
        return len(self.__data)
    def size(self):
        return len(self.__data)
p1=person("鸡哥")
p2=person("er hu")
p3=person("er wa")
p4=person("li hua")
q1=priority_queue()
q1.enqueue(p1,1)
q1.enqueue(p2,2)
q1.enqueue(p3,2)
q1.enqueue(p4,3)


print(q1.front().name)
q1.dequeue()
print(q1.front().name)
print(q1.size())

功能介绍

1,优先队列元素的放入

代码如下(示例):

    def enqueue(self,item,prior):
          dic={}          #建立一个字典,分别写入他的名字和优先级
          dic["prior"]=prior
          dic["value"]=item
          flag=True       #设置一个标签值
          for index in range(len(self.__data)):  #有元素时,循环来对比优先级进行插入
             if  self.__data[index].get("prior")>=prior :  #优先级高的放后面
                   self.__data.insert(index,dic)   
                   flag=False
                   break                  #需要终止,以免多次循环,导致后续size()函数计数变多
          else:
              if flag or len(self.__data)==0:    #没有数据时或者原来队列没有优先级比新数据优先级高时直接放入
                 self.__data.append(dic)

2,队列第一个数据的取出查看

    def front(self):
        if len(self.__data)==0:   #没有值返回空
                 return None
        return self.__data[-1].get("value") #根据队列先进先出特性返回末尾元素,极为队列第一个元素

3,删除优先队列第一个元素

    def dequeue(self):
            if len(self.__data) == 0:
                return None
            return self.__data.pop().get("value")

 删除之后,优先队列不在有这个元素。

4,判断是否为空与多少个元素:

    def is__empty(self):
        return len(self.__data)==0
    def __len__(self):
        return len(self.__data)
    def size(self):
        return len(self.__data)

 运行结果:

li hua
er hu
3
 


总结

优先队列比队列多考虑一个优先级的问题,所以插入时要考虑优先级顺序,优先级相同也遵循队列先进先出的特性,队列元素插入中,在for循环中要使用break,不然列表长度会多次计数导致长度不准确。同时利用了字典的特性分别包含了名称与优先级,方便了后续操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值