今天我們來到了循環隊列這一節,之前的文章中,我介紹過了用python自帶的列表來實現隊列,這是最簡單的實現方法。
但是,我們都知道,在列表中刪除第一個元素和刪除最后一個元素花費的時間代價是不一樣的,刪除列表的第一個元素,那么在它之后的所有元素都要進行移動。所以當列表特別長的時候,這個代價就比較明顯了。我們本文介紹的循環隊列可以避免這個問題,同樣我們上篇文章提到的用鏈表實現的方法也可以避免。
下面,我們來介紹循環隊列。
循壞隊列
循環隊列,就是將普通的隊列首尾連接起來, 形成一個環狀,并分別設置首尾指針,用來指明隊列的頭和尾。每當我們插入一個元素,尾指針就向后移動一位,當然,在這里我們隊列的最大長度是提前定義好的,當我們彈出一個元素,頭指針就向后移動一位。
這樣,列表中就不存在刪除操作,只有修改操作,從而避免了刪除前面節點造成的代價大的問題。
好,話不多說,我們用代碼來實現一下
class Loopqueue: def __init__(self, length): self.head = 0 self.tail = 0 self.maxSize = length self.cnt = 0 self.__list = [None]*length
這里同樣,我們定義一個隊列類,在實例化循環隊列的時候,要求指定隊列的大小,除了首尾指針以及隊列最大長度之外,我們還聲明一個表示隊列當前長度的屬性cnt。
接下來我們給隊列增加一些操作:
判空
def isEmpty(self): return self.cnt == 0
判滿
def isFull(self): return self.cnt == self.maxSize
添加元素
def push(self, data): if self.isFull(): return False if self.isEmpty(): self.__list[0] = data self.head = 0 self.tail = 0 self.cnt = 1 return True self.tail = (self.tail+1)%self.maxSize self.cnt += 1 self.__list[self.tail] = data return True
彈出元素
def pop(self): if self.isEmpty(): return False data = self.__list[self.head] self.head = (self.head+1)%self.maxSize self.cnt -= 1 return data
清空隊列
def clear(self): self.head = 0 self.tail = 0 self.cnt = 0 return True
定義len和print函數
def __len__(self): return self.cnt def __str__(self): s = '' for i in range(self.cnt): index = (i + self.head) % self.maxSize s += str(self.__list[index])+' ' return s
OK,我們的循環隊列類就定義好了,如果你看過介紹隊列的文章,就會發現循環隊列和普通隊列的操作在邏輯上還是有一些相似的。
總結
以上所述是小編給大家介紹的Python 實現數據結構-循環隊列的操作方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
