文章目录
一、队列
队列列Queue是一种有次序的数据集合,其特征是
- 新数据项的添加总发生在一端(通常称为“尾rear”端),而现存数据项的移除总发生在另一端(通常称为“首front”端)
- 当数据项加入队列,首先出现在队尾,随着队首数据项的移除,它逐渐接近队首。
- 新加入的数据项必须在数据集末尾等待,而等待时间最长的数据项则是队首。这种次序安排的原则称为(FIFO:First-in first-out)先进先出,或“先到先服务first-come first-served”
- 队列仅有一个入口和一个出口不允许数据项直接插入队中,也不允许从中间移除数据项
队列的例子:排队,打印队列,进程调度,键盘缓冲
抽象数据类型Queue
方法名 | 描述 | 返回值 |
---|---|---|
Queue() | 创建一个空队列对象 | Queue对象 |
enqueue(item) | 将数据项item添加到队尾 | 无返回值 |
dequeue() | 从队首移除数据项,队列被修改 | 队首数据项 |
isEmpty() | 测试是否为空队列 | 布尔值 |
size() | 返回队列中数据项的个数 | 数据项个数(整数) |
Python实现ADT Queue
- 队首是列表的末端;队尾是列表的首端。也可以倒过来。
class Queue:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
return self.items.pop()
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)
二、队列的应用-约瑟夫问题
约瑟夫问题
- 传说犹太人反叛罗马人,落到困境,约瑟夫和39人决定坐成一圈儿,报数1~7,报到7的人淘汰,结果约瑟夫给自己安排了个位置,最后活了下来……
- 我们用传递热土豆来模拟
- 模拟程序采用队列来存放所有参加游戏的人名,游戏时,队首始终是持有土豆的人
- 模拟游戏开始,只需要将队首的人出队,随即再到队尾入队,算是土豆的一次传递
- 土豆每传递7次,将队首的人移除,不再入队如此反复,直到队列中剩余1人
def josephus(name_list, num):
# 在name_list人中,每数到num的人就会被淘汰
q = Queue()
for i in name_list:
q.enqueue(i)
while q.size