Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(2)
傳土豆
隊(duì)列的一個(gè)典型方法是模擬需要以 FIFO 方式管理數(shù)據(jù)的真實(shí)場(chǎng)景??紤]這樣一個(gè)游戲:傳土豆。在這個(gè)游戲中,成員們圍成一圈,并依次盡可能快地傳遞一個(gè)土豆。在某個(gè)時(shí)刻,大家停止傳遞,此時(shí)手里有土豆的成員就得退出游戲。 重復(fù)上述過(guò)程,直到只剩下一個(gè)成員。
我們將針對(duì)傳土豆游戲?qū)崿F(xiàn)通用的模擬程序。該程序接受一個(gè)名字列表和一個(gè)用于計(jì)數(shù)的常量 num ,并且返回最后剩下的那個(gè)人的名字。
我們使用隊(duì)列來(lái)模擬一個(gè)環(huán)。即假設(shè)握著土豆的人位于隊(duì)列的頭部。在模擬傳土豆的過(guò)程中,程序?qū)⑦@個(gè)人的名字移出隊(duì)列,然后立刻將其插入隊(duì)列的尾部。隨后,這個(gè)人會(huì)一直等待,直到再次到達(dá)隊(duì)列的頭部。在出列和入列 num 次之后,此時(shí)位于隊(duì)列頭部的人出局,新一輪游戲開始。如此反復(fù),直到隊(duì)列中只剩下一個(gè)名字(即隊(duì)列的大小為 1)。
class Queue: def __init__(self): self.items = [] # 構(gòu)建空隊(duì)列 def isEmpty(self): return self.items ==[] # 判斷是否為空 def enqueue(self,item): self.items.insert(0, item) # 在隊(duì)列尾部(列表左端)插入元素 def dequeue(self): return self.items.pop() # 在隊(duì)列頭部(列表右端)移出元素 def size(self): return len(self.items) # 隊(duì)列(列表)長(zhǎng)度 def look(self): print(self.items) def transmitPotato(nameList, num): simqueue = Queue() # 創(chuàng)建隊(duì)列 for name in nameList: # 遍歷成員姓名列表 simqueue.enqueue(name) # 成員姓名入隊(duì)列 while simqueue.size() > 1: # 當(dāng)隊(duì)列元素個(gè)數(shù)大于1時(shí) 循環(huán)執(zhí)行 for i in range(num): # 循環(huán)num次(土豆傳遞num次) # 成員姓名從隊(duì)頭轉(zhuǎn)換至隊(duì)尾 simqueue.enqueue(simqueue.dequeue()) # 成員姓名出隊(duì)(此成員淘汰出局) simqueue.dequeue() return simqueue.dequeue() # 返回隊(duì)列里最后剩下的名字
調(diào)用 transmitPotato 函數(shù),使用 7 作為計(jì)數(shù)常量,將得到以下結(jié)果:
注意,在上例中,計(jì)數(shù)常量大于列表中的名字個(gè)數(shù)。 這不會(huì)造成問(wèn)題,因?yàn)殛?duì)列模擬了一個(gè)環(huán)。同時(shí)需要注意,當(dāng)名字列表載入隊(duì)列時(shí),列表中的第一個(gè)名字出現(xiàn)在隊(duì)列的頭部。在上例中,小明是列表中的第一個(gè)元素,因此處在隊(duì)列的最前端。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python中static相關(guān)知識(shí)小結(jié)
static用法:是一個(gè)修飾符,用于修飾成員(成員變量,成員函數(shù)).當(dāng)成員被靜態(tài)修飾后,就多了一個(gè)調(diào)用方式,除了可以被對(duì)象調(diào)用外,還可以直接被類名調(diào)用,格式——類名.靜態(tài)成員。2018-01-01Python venv虛擬環(huán)境配置過(guò)程解析
這篇文章主要介紹了Python venv虛擬環(huán)境配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07python使用PyV8執(zhí)行javascript代碼示例分享
這篇文章主要介紹了python使用PyV8執(zhí)行javascript的小示例,大家參考使用吧2013-12-12PyQt5通過(guò)信號(hào)實(shí)現(xiàn)MVC的示例
這篇文章主要介紹了PyQt5通過(guò)信號(hào)實(shí)現(xiàn)MVC的示例,幫助大家更好的理解和使用pyqt5,感興趣的朋友可以了解下2021-02-02Python全棧之文件函數(shù)和函數(shù)參數(shù)
這篇文章主要為大家介紹了Python的文件函數(shù)和函數(shù)參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12Python中執(zhí)行MySQL結(jié)果限制和分頁(yè)查詢示例詳解
這篇文章主要為大家介紹了Python中執(zhí)行MySQL結(jié)果限制和分頁(yè)查詢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11