队列及其应用
队列的含义
队列可以抽象成排队,先进先出(FIFO)。
队列用一个列表表示,添加元素总发生在一端,我们称之为尾端(rear),而移除发生在另外一端,我们称之为首端(front)。
队列的实现:
class Queue:
# 横着的话,从左端进,从右端出
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
# 进入列表,算法复杂度:O(n)
def enqueue(self, item):
self.items.insert(0, item)
# 出列表,算法复杂度:O(1)
def dequeue(self):
return self.items.pop()
队列的应用——约瑟夫问题
问题描述:n个人围成一圈,依次报数1~7,报到7的人从圈中剔除,剩下的人继续报数。一直到最后会剩下一个人,问:最后剩下的人是谁?
python代码实现:
def hotPotato(namelist, num):
# namelist:参加game的人
# num:一次种传递的次数
simqueue = Queue()
for name in namelist:
simqueue.enqueue(name)
while simqueue.size() > 1:
for i in range(num):
simqueue.enqueue(simqueue.dequeue())
# num次循环后,踢走一个
simqueue.dequeue()
return simqueue.dequeue()
测试:
print(hotPotato(['a', 'b', 'c', 'd', 'e', 'f'], 7))
结果:
c
上述我们介绍的是普通队列,即一端输入,另一端输出。事实上,还存在的双端队列,队列的两端都可以输入和输出(个人觉得没什么实际意义),有兴趣的好奇宝宝可以自己尝试实现。