队列
- 特性: 先进先出
- 应用: 多台计算机向一台打印机发送打印任务,打印机接收到的第一个进入的任务先完成,最后一个任务最后完成。
# 代码实现
"""
Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
is_empty() 查看队列是否为空。它不需要参数,并返回布尔值。
size() 返回队列中的项数。它不需要参数,并返回一个整数。
"""
class Queue:
def __init__(self):
self.items = [] # 这里可以想象成列表的右侧是队首,左侧为队尾
def enqueue(self, item):
""" 将item添加到队尾 """
self.items.insert(0, item)
def dequeue(self):
""" 从队首移除项并返回 """
return self.items.pop()
def is_empty(self):
""" 判断队列是否为空 返回True|False """
return self.items == []
def size(self):
""" 返回队列的长度 """
return len(self.items)
queue = Queue()
alist = [1, 2, 3, 4, 5]
for a in alist:
queue.enqueue(a)
for i in range(queue.size()):
print(queue.dequeue())
两个小案例
-
案例一
-
""" 6个动物围成一个圈,排列顺序孩子们自己指定。第一个动物手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。 规则是:在计时器每计时10秒时,手里有山芋的动物退出游戏。该游戏直到剩下一个动物时结束,最后剩下的动物获胜。 请使用队列实现该游戏策略,排在第几个位置最终会获胜。 分析: 假设下面是一个栈,左侧为队尾,右侧为队首,在队首第一个位置的动物就是拿着山芋的 一开始: [6, 5, 4, 3, 2, 1] 第一轮: [1, 6, 5, 4, 3, 2] 将队首动物拿出,然后添加从队尾添加 第二轮: [1, 2, 6, 5, 4, 3] ... 第十轮: 此时将在队首的动物淘汰 """ # 6个动物 kids = ['A', 'B', 'C', 'D', 'E', 'F'] # 将6个动物依次添加到队列中 queue = Queue() for kid in kids: queue.enqueue(kid) while queue.size() > 1: """ 当队列长度大于1时,执行以下代码 """ for i in range(9): """ 7秒淘汰一个,9秒内是不淘汰的 """ kid = queue.dequeue() # 将队首的动物拿出来 queue.enqueue(kid) # 将拿出来的动物放到队尾 # 过完9秒,将此时在队首的动物淘汰 queue.dequeue() print(queue.dequeue()) # 此时输出的是获胜者
-
-
案例2
-
""" 如何使用两个队列实现一个栈 分析: 队列是先进先出,栈是先进后出,所以要实现先进后出,后进先出 先实例化两个队列 队列A有5个数据,队列B没有数据 将有数据的队列A,一直删除,将删除的数据添加到没数据的队列B中,直到有数据的队列还剩一个数据的时候,说明那个数据是最后进来的,再将其真正的删除掉 此时队列A是没数据的,队列B是有数据的,再将两个互换数据 然后依次进行,直到互换数据后,队列A没数据 """ q1 = Queue() # 队列A q2 = Queue() # 队列2 alist = [1, 2, 3, 4, 5] for a in alist: q1.enqueue(a) # 向队列A中添加数据 while q1.size() > 0: """ 当q1没有数据时,循环结束 """ while q1.size() > 1: """ 当队列A中数据数量大于1时 """ item = q1.dequeue() # q1删除数据 q2.enqueue(item) # q2接收数据 print(q1.dequeue()) # 此时删除的数据是最后进来的,让它先出去 q1, q2 = q2, q1 # q1, q2互换
-