优先级队列
这是包含优先级元素的集合,当一个元素被插入优先级队列中时,用户可以通过提供一个关联建来为该元素赋予一定的优先级,键值最小的元素将是下一个从队列中移出的元素。
我们可以使用用key-value对一个元素和它的优先级进行表示,例如,P.add()方法为添加元素操作,p.min()返回优先级队列中拥有最小键值的元组,
操作 | 优先级队列 |
P.add(5,A) | {(5,A)} |
P.add(9,C) | {(5,A),(9,C)} |
P.add(3,B) | {(3,B)(5,A),(9,C)} |
P.min() | (3,B) |
优先级队列的特征
- #优先级队列是在普通队列的基础上将队列中的数据元素按照关键字的值进行有序的排序
- #优先级队列在队首进行删除的操作,但为了保证队列的优先级顺序插入操作不一定在队列的尾部进行
- #优先级队列可以由链表和顺序表实现,
- #但为了快速的访问高级的元素和快速的插入元素,通常使用链式存储结构。
优先队列的实现
程序的主要实现难点在怎么实现插入元素,在插入元素的过程中,应该和已有的元素进行对比,然后将插入的元素放到合适的位置,
和已有对比后有四中插入情况:
- 队列为空;
- 将元素插入队列首部;
- 将元素插入队列的尾部;
- 将元素插入在队列的中间位置;
将元素插入队列首部
将元素插入队列的尾部
将元素插入在队列的中间位置
"""优先级队列"""
#优先级队列是在普通队列的基础上将队列中的数据元素按照
#关键字的值进行有序的排序
#优先级队列在队首进行删除的操作,但为了保证队列的优先级顺序
#插入操作不一定在队列的尾部进行
#优先级队列可以由链表和顺序表实现,
#但为了快速的访问高级的元素和快速的插入元素,通常使用链式存储结构
class PriorityNode():
def __init__(self,data=None,priority=None,next=None):
self.data = data
self.priority = priority
self.next = next
class PriorityQueue(object):
def __init__(self):
self.front = None
self.rear = None
def clear(self):
self.front = None
self.rear = None
def isEmpty(self):
return self.front is None
def length(self):
p = self.front
i = 0
while p is not None:
p = p.next
i += 1
return i
def peek(self):
if self.isEmpty():
return None
else:
return self.front.data
def offer(self,x,priority):
s = PriorityNode(x,priority,None)
if not self.isEmpty():
p = self.front
q = self.front
while p is not None and p.priority <= s.priority:
q = p
p = p.next
#元素位置的三种情况
if p is None:#队尾
self.rear.next = s
self.rear = s
elif p == self.front:#对首
s.next = self.front
self.front = s
else:#队中
q.next = s
s.next = p
else:
self.front = self.rear = s
def poll(self):
if self.isEmpty():
return None
p = self.front
self.front = self.front.next
if p == self.rear:#删除节点为队尾节点是需要修改rear
self.rear = None
return p.data
def display(self):
p = self.front
while p is not None:
print(p.data,end=" ")
p = p.next
prorityQue = PriorityQueue()
#prorityQue.clear()
prorityQue.offer("A",3)
prorityQue.offer("C",8)
prorityQue.offer("D",4)
print("打印队列的元素")
prorityQue.display()
print("打印队列首部元素")
prorityQue.peek()
print("取出队列首部元素")
prorityQue.poll()
print("打印队列的元素")
prorityQue.display()
print("打印队列的元素")
prorityQue.display()
打印队列的元素
A D C
print("打印队列首部元素")
prorityQue.peek()
打印队列首部元素
Out[16]: 'A'
print("取出队列首部元素")
prorityQue.poll()
取出队列首部元素
Out[17]: 'A'
print("打印队列的元素")
prorityQue.display()
打印队列的元素
D C