队列抽象数据类型由以下结构和操作定义。队列被构造为在队尾添加项的有序集合,并且从队首移除。队列保持 FIFO 排序属性。 队列操作如下。
- Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
- enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
- dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
- isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
- size() 返回队列中的项数。它不需要参数,并返回一个整数。
队列的典型应用之一是模拟需要以 FIFO 方式管理数据的真实场景。首先,让我们看看孩子们的游戏烫手山芋,在这个游戏中,孩子们围成一个圈,并尽可能快的将一个山芋递给旁边的孩子。在某一个时间,动作结束,有山芋的孩子从圈中移除。游戏继续开始直到剩下最后一个孩子。
为了模拟这个圈,我们使用队列。假设拿着山芋的孩子在队列的前面。当拿到山芋的时候,这个孩子将先出列再入队列,把他放在队列的最后。经过 num 次的出队入队后,前面的孩子将被永久移除队列。并且另一个周期开始,继续此过程,直到只剩下一个名字(队列的大小为 1)。
# 实现队列功能
class QueueTest:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.insert(0, item) # 队列实现插入元素
def dequeue(self):
return self.items.pop() # 队列实现删除末尾元素
def isEmpty(self):
return self.items == [] # 检查队列是否为空
def size(self):
return len(self.items) # 返回队列大小
# 模拟烫手山芋游戏
def hotPotato(namelist, num):
queue = QueueTest()
for name in namelist:
queue.enqueue(name)
while queue.size() > 1:
for i in range(num):
queue.enqueue(queue.dequeue())
queue.dequeue()
return queue.dequeue()
if __name__ == '__main__':
print(hotPotato(["Bill", "David", "Susan", "Jane", "Kent", "Brad"], 7))