Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列詳解
本文實(shí)例講述了Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列。分享給大家供大家參考。具體分析如下:
一、概述
隊(duì)列(Queue)是一種先進(jìn)先出(FIFO)的線(xiàn)性數(shù)據(jù)結(jié)構(gòu),插入操作在隊(duì)尾(rear)進(jìn)行,刪除操作在隊(duì)首(front)進(jìn)行。
二、ADT
隊(duì)列ADT(抽象數(shù)據(jù)類(lèi)型)一般提供以下接口:
① Queue() 創(chuàng)建隊(duì)列
② enqueue(item) 向隊(duì)尾插入項(xiàng)
③ dequeue() 返回隊(duì)首的項(xiàng),并從隊(duì)列中刪除該項(xiàng)
④ empty() 判斷隊(duì)列是否為空
⑤ size() 返回隊(duì)列中項(xiàng)的個(gè)數(shù)
隊(duì)列操作的示意圖如下:
三、Python實(shí)現(xiàn)
使用Python的內(nèi)建類(lèi)型list列表,可以很方便地實(shí)現(xiàn)隊(duì)列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)
四、應(yīng)用
著名的 約瑟夫斯問(wèn)題(Josephus Problem)是應(yīng)用隊(duì)列(確切地說(shuō),是循環(huán)隊(duì)列)的典型案例。在 約瑟夫斯問(wèn)題 中,參與者圍成一個(gè)圓圈,從某個(gè)人(隊(duì)首)開(kāi)始報(bào)數(shù),報(bào)數(shù)到n+1的人退出圓圈,然后從退出人的下一位重新開(kāi)始報(bào)數(shù);重復(fù)以上動(dòng)作,直到只剩下一個(gè)人為止。
值得注意的是,Queue類(lèi)只實(shí)現(xiàn)了簡(jiǎn)單隊(duì)列,上述問(wèn)題實(shí)際上需要用循環(huán)隊(duì)列來(lái)解決。在報(bào)數(shù)過(guò)程中,通過(guò)“將(從隊(duì)首)出隊(duì)的人再入隊(duì)(到隊(duì)尾)”來(lái)模擬循環(huán)隊(duì)列的行為。具體代碼如下:
#!/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))
運(yùn)行結(jié)果:
$ python josephus.py Susan
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python文件讀取read及readlines兩種方法使用詳解
這篇文章主要為大家介紹了python文件讀取read及readlines兩種方法的使用示例及區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Python用matplotlib庫(kù)畫(huà)圖中文和負(fù)號(hào)顯示為方框的問(wèn)題解決
matplotlib中畫(huà)圖的時(shí)候會(huì)遇到負(fù)號(hào)顯示為方框的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Python用matplotlib庫(kù)畫(huà)圖中文和負(fù)號(hào)顯示為方框的問(wèn)題解決,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07解決python xx.py文件點(diǎn)擊完之后一閃而過(guò)的問(wèn)題
今天小編就為大家分享一篇解決python xx.py文件點(diǎn)擊完之后一閃而過(guò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06spark?dataframe全局排序id與分組后保留最大值行
這篇文章主要為大家介紹了spark?dataframe全局排序id與分組后保留最大值行實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02python面向?qū)ο骭詳談?lì)惖睦^承與方法的重載
下面小編就為大家?guī)?lái)一篇python面向?qū)ο骭詳談?lì)惖睦^承與方法的重載。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06