一、优先队列
通过优先级的不同来排队的队列叫做优先队列,在现实中可以参照医生优先处理病情严重的患者,以及飞机经济舱头等舱排队
代码如下(示例):
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,不然列表长度会多次计数导致长度不准确。同时利用了字典的特性分别包含了名称与优先级,方便了后续操作