Python實現(xiàn)的數(shù)據(jù)結構與算法之隊列詳解
本文實例講述了Python實現(xiàn)的數(shù)據(jù)結構與算法之隊列。分享給大家供大家參考。具體分析如下:
一、概述
隊列(Queue)是一種先進先出(FIFO)的線性數(shù)據(jù)結構,插入操作在隊尾(rear)進行,刪除操作在隊首(front)進行。
二、ADT
隊列ADT(抽象數(shù)據(jù)類型)一般提供以下接口:
① Queue() 創(chuàng)建隊列
② enqueue(item) 向隊尾插入項
③ dequeue() 返回隊首的項,并從隊列中刪除該項
④ empty() 判斷隊列是否為空
⑤ size() 返回隊列中項的個數(shù)
隊列操作的示意圖如下:
三、Python實現(xiàn)
使用Python的內(nèi)建類型list列表,可以很方便地實現(xiàn)隊列ADT:
#!/usr/bin/env python # -*- coding: utf-8 -*- class Queue: def __init__(self): self.items = [] def enqueue(self, item): self.items.append(item) def dequeue(self): return self.items.pop(0) def empty(self): return self.size() == 0 def size(self): return len(self.items)
四、應用
著名的 約瑟夫斯問題(Josephus Problem)是應用隊列(確切地說,是循環(huán)隊列)的典型案例。在 約瑟夫斯問題 中,參與者圍成一個圓圈,從某個人(隊首)開始報數(shù),報數(shù)到n+1的人退出圓圈,然后從退出人的下一位重新開始報數(shù);重復以上動作,直到只剩下一個人為止。
值得注意的是,Queue類只實現(xiàn)了簡單隊列,上述問題實際上需要用循環(huán)隊列來解決。在報數(shù)過程中,通過“將(從隊首)出隊的人再入隊(到隊尾)”來模擬循環(huán)隊列的行為。具體代碼如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- def josephus(namelist, num): simqueue = Queue() for name in namelist: simqueue.enqueue(name) while simqueue.size() > 1: for i in xrange(num): simqueue.enqueue(simqueue.dequeue()) simqueue.dequeue() return simqueue.dequeue() if __name__ == '__main__': print(josephus(["Bill", "David", "Kent", "Jane", "Susan", "Brad"], 3))
運行結果:
$ python josephus.py Susan
希望本文所述對大家的Python程序設計有所幫助。
相關文章
python文件讀取read及readlines兩種方法使用詳解
這篇文章主要為大家介紹了python文件讀取read及readlines兩種方法的使用示例及區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Python用matplotlib庫畫圖中文和負號顯示為方框的問題解決
matplotlib中畫圖的時候會遇到負號顯示為方框的問題,下面這篇文章主要給大家介紹了關于Python用matplotlib庫畫圖中文和負號顯示為方框的問題解決,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07spark?dataframe全局排序id與分組后保留最大值行
這篇文章主要為大家介紹了spark?dataframe全局排序id與分組后保留最大值行實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02