定义
有序集合,添加操作发生在“尾部”,移除操作则发生在“头部”。
新元素从尾部进入队列,然后一直向前移动到头部,直到成为下一个被移除的元素。
最新添加的元素必须在队列的尾部等待,在队列中时间最长的元素则排在最前面。这种排序原则被称作FIFO (first-in first-out),即先进先出,也称先到先得。
好的队列只允许一头进,另一头出,不可能发生插队或者中途离开的情况。
实现
"""
如前所述,队列是元素的有序集合,添加操作发生在其尾部,移除操作则发生在头部。
Queue() 创建一个空队列。它不需要参数,且会返回一个空队列。
enqueue(item) 在队列的尾部添加一个元素。它需要一个元素作为参数,不返回任何值。
dequeue() 从队列的头部移除一个元素。它不需要参数,且会返回一个元素,并修改队列的内容。
isEmpty() 检查队列是否为空。它不需要参数,且会返回一个布尔值。
size() 返回队列中元素的数目。它不需要参数,且会返回一个整数。
"""
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
self.items.pop()
def size(self):
return len(self.items)
应用
TODO
传土豆游戏(等价于约瑟夫问题)
""" 在这个游戏中,孩子们围成一圈,并依次尽可能快地传递一个土豆。在某个时刻,停止传递, 此时手里有土豆的孩子就得退出游戏,直到剩下一个孩子。 使用队列来模拟一个环,假设握着土豆的孩子在队列头部。在模拟过程中,程序将这个孩子的 名字移出队列,然后立刻插入队列尾部。随后这个孩子会一直等待,直到再次到达队列的头部。 在出列和入列num次之后,此时位于头部的孩子出局,新一轮游戏开始。如此反复,直到队列中 只剩下一个名字,此时队列大小为1. """
打印任务
""" 学生向共享打印机发送打印请求,这些打印任务被存在一个队列中,并且按照先到先得的顺序执行。 这样的设定可能导致很多问题。其中最重要的是,打印机能否处理一定量的工作。 如果不能,学生可能会由于等待过长时间而错过要上的课。 考虑计算机科学实验室里的这样一个场景:在任何给定的一小时内,实验室里都有约10个学生。 他们在这一小时内最多打印2次,并且打印的页数从1到20不等。实验室的打印机比较老旧, 每分钟只能以低质量打印10页。可以将打印质量调高,但是这样做会导致打印机每分钟只能打印5页。 降低打印速度可能导致学生等待过长时间。那么,应该如何设置打印速度呢? ... 需要一些概率学知识。 模拟的本质。在常用参数已知的情况下尽可能准确地模拟。 这些问题都能通过修改本例中的模拟程序来解答。但是,模拟的准确度取决于它所基于的假设和参数。 真实的打印任务数量和学生数目是准确构建模拟程序必不可缺的数据。 """