python有序隊列,python實現列隊

 2023-11-19 阅读 28 评论 0

摘要:1 列隊定義 隊列是項的有序結合,其中添加新項的一端稱為隊尾,移除項的一端稱為隊首。當一個元素從隊尾進入隊列時,一直向隊首移動,直到它成為下一個需要移除的元素為止。 最近添加的元素必須在隊尾等待。集合中存活時間最長的元素在隊首,

1 列隊定義

隊列是項的有序結合,其中添加新項的一端稱為隊尾,移除項的一端稱為隊首。當一個元素從隊尾進入隊列時,一直向隊首移動,直到它成為下一個需要移除的元素為止。
最近添加的元素必須在隊尾等待。集合中存活時間最長的元素在隊首,這種排序成為 FIFO,先進先出,也被成為先到先得。
隊列的最簡單的例子是我們平時不時會參與的列。排隊等待電影,在雜貨店的收營臺等待,在自助餐廳排隊等待(這樣我們可以彈出托盤棧)。行為良好的線或隊列是有限制的,因為它只有一條路,只有一條出路。不能插隊,也不能離開。你只有等待了一定的時間才能到前面。下圖展示了一個簡單的python對象的列隊。
這里寫圖片描述
計算機科學也有常見的隊列示例。我們的計算機實驗室有 30 臺計算機與一臺打印機聯網。當學生想要打印時,他們的打印任務與正在等待的所有其他打印任務“一致”。第一個進入的任務是先完成。如果你是最后一個,你必須等待你前面的所有其他任務打印。我們將在后面更詳細地探討這個有趣的例子。
除了打印隊列,操作系統使用多個不同的隊列來控制計算機內的進程。下一步做什么的調度通常基于盡可能快地執行程序和盡可能多的服務用戶的排隊算法。此外,當我們敲擊鍵盤時,有時屏幕上出現的字符會延遲。這是由于計算機在那一刻做其他工作。按鍵的內容被放置在類似隊列的緩沖器中,使得它們最終可以以正確的順序顯示在屏幕上。

2 列隊抽象數據類型

隊列抽象數據類型由以下結構和操作定義。如上所述,隊列被構造為在隊尾添加項的有序集合,并且從隊首移除。隊列保持 FIFO 排序屬性。 隊列操作如下。
Queue() 創建一個空的新隊列。 它不需要參數,并返回一個空隊列。
enqueue(item) 將新項添加到隊尾。 它需要 item 作為參數,并不返回任何內容。
dequeue() 從隊首移除項。它不需要參數并返回 item。 隊列被修改。
isEmpty() 查看隊列是否為空。它不需要參數,并返回布爾值。
size() 返回隊列中的項數。它不需要參數,并返回一個整數。
如下表所示,我們假設 q 是已經創建并且當前為空的隊列,則 Table 1 展示了隊列操作序列的結果。右邊表示隊首。 4 是第一個入隊的項,因此它 dequeue 返回的第一個項。
這里寫圖片描述

3 python實現棧

python有序隊列。實現隊列抽象數據類型創建一個新類,使用列表集合來作為構建隊列的內部表示。假定隊尾在列表中的位置為 0。這允許我們使用列表上的插入函數向隊尾添加新元素。彈出操作可用于刪除隊首的元素(列表的最后一個元素)。代碼如下:

class Queue:def __init__(self):self.items = []def isEmpty(self):return self.items == []def enqueue(self, item):self.items.insert(0,item)def dequeue(self):return self.items.pop()def size(self):return len(self.items)

4 列隊的模擬——燙手的山芋

游戲燙手山芋,在這個游戲中,孩子們圍成一個圈,并盡可能快的將一個山芋遞給旁邊的孩子。在某一個時間,動作結束,有山芋的孩子從圈中移除。游戲繼續開始直到剩下最后一個孩子。

思路:為了模擬這個圈,我們使用隊列(見下圖)。假設拿著山芋的孩子在隊列的前面。當拿到山芋的時候,這個孩子將先出列再入隊列,把他放在隊列的最后。經過 num 次的出隊入隊后,前面的孩子將被永久移除隊列。并且另一個周期開始,繼續此過程,直到只剩下一個名字(隊列的大小為 1)
這里寫圖片描述
實現代碼:

from pythonds.basic.queue import Queuedef hotPotato(namelist, num):simqueue = Queue()for name in namelist:simqueue.enqueue(name)while simqueue.size() > 1:for i in range(num):simqueue.enqueue(simqueue.dequeue())simqueue.dequeue()return simqueue.dequeue()

Python隊列、輸入

print(hotPotato(["Bill","David","Susan","Jane","Kent","Brad"],7))

輸出
Susan

請注意,在此示例中,計數常數的值大于列表中的名稱數。這不是一個問題,因為隊列像一個圈,計數會重新回到開始,直到達到計數值。另外,請注意,列表加載到隊列中以使列表上的名字位于隊列的前面。在這種情況下,Bill 是列表中的第一個項,因此他在隊列的前面。

python應用。參考資料:《problem-solving-with-algorithms-and-data-structure-using-python》
http://www.pythonworks.org/pythonds

轉載于:https://www.cnblogs.com/mtcnn/p/9411622.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/184128.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息