队列
(Queue)
,它是一种运算受限的线性表
,
先进先出
(FIFO First In First Out)
队列是一种受限的线性结构
受限之处在于它只允许在表的前端(
front
)进行删除操作,而在表的后端(
rear
)进行插入
操作
类似生活中
优先排队的人,
优先处理
. (
买票
,
结账等
)
队列常见的操作
enqueue(element)
:向队列尾部添加一个(或多个)新的项。
dequeue()
:移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
front()
:返回当前队列中第一个元素,也将是最先被移除的元素。队列不做任何变动(不
移除元素,只返回元素信息
——
与
Stack
类的
peek
方法非常类似)。
isEmpty()
:如果队列中不包含任何元素,返回
true
,否则返回
false
。
size()
:返回队列包含的元素个数,与数组的
length
属性类似
普通的队列实现
class Queue: # 定义一个名为Queue的类
def __init__(self): # 初始化函数,当创建一个新的Queue对象时自动执行
self.items = [] # 初始化一个空列表,用于存储队列的元素
def enqueue(self, element): # 入队函数,添加一个新元素到队列尾部
self.items.append(element)
def dequeue(self): # 出队函数,移除队列的第一个元素并返回
if len(self.items) < 1: # 如果队列为空
return None # 返回None
return self.items.pop(0) # 否则,移除并返回队列的第一个元素
def front(self): # 获取队首元素函数,返回队列的第一个元素但不移除
if len(self.items) < 1: # 如果队列为空
return None # 返回None
return self.items[0] # 否则,返回队列的第一个元素
def is_empty(self): # 检查队列是否为空的函数
return len(self.items) == 0 # 如果队列长度为0,返回True,否则返回False
def size(self): # 获取队列大小的函数,返回队列的元素个数
return len(self.items)
优先级队列的实现
实现优先级队列相对队列主要有两方面需要考虑
:
1.
封装元素和优先级放在一起
(
可以封装一个新的类
)
2.
添加元素时
,
将当前的优先级和队列中已经存在的元素优先级进行比较
,
以获得自己正确
的位置
class PriorityQueue:
class QueueElement:
def __init__(self, element, priority):
self.element = element
self.priority = priority
def __init__(self):
self.items = []
def enqueue(self, element, priority):
queue_element = self.QueueElement(element, priority)
if self.is_empty():
self.items.append(queue_element)
else:
added = False
for i in range(len(self.items)):
# 注意:我们这里是数字越小,优先级越高
if queue_element.priority < self.items[i].priority:
self.items.insert(i, queue_element)
added = True
break
if not added:
self.items.append(queue_element)
def dequeue(self):
return self.items.pop(0)
def front(self):
return self.items[0]
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)