隊列(Queue)是一種先進先出(FIFO)的線性數(shù)據(jù)結(jié)構(gòu)涵亏,插入操作在隊尾(rear)進行妥色,刪除操作在隊首(front)進行吨些。
Class Queue():
def __init__(self):
self.items =[ ]
def enqueue(self, item):
self.items.append(item)
def dequeue(self, item)
return self. items. pop(0)
def empty():
return self.size()==0
def size():
return len(self.items)
著名的 約瑟夫斯問題(Josephus Problem)是應用隊列(確切地說,是循環(huán)隊列)的典型案例刁愿。在 約瑟夫斯問題 中绰寞,參與者圍成一個圓圈,從某個人(隊首)開始報數(shù)铣口,報數(shù)到n+1的人退出圓圈滤钱,然后從退出人的下一位重新開始報數(shù);重復以上動作枷踏,直到只剩下一個人為止菩暗。
值得注意的是,Queue類只實現(xiàn)了簡單隊列旭蠕,上述問題實際上需要用循環(huán)隊列來解決。在報數(shù)過程中旷坦,通過“將(從隊首)出隊的人再入隊(到隊尾)”來模擬循環(huán)隊列的行為掏熬。具體代碼如下:
def josephus(nameList, num):
simqueue = Queue()
for name in namelist:
simqueue.enqueue(name)
while simqueuue.size()>1:
for x in range(num):
simqueue.enqueue(simqueue.dequeue())
simqueue.dequeue()
return simqueue.dequeue()
if __name = '__main__':
print(josephus(["Bill", "David", "Kent", "Jane", "Susan", "Brad"],3))