今天我們來到了迴圈佇列這一節,之前的文章中,我介紹過了用python自帶的列表來實現佇列,這是最簡單的實現方法。
但是,我們都知道,在列表中刪除第乙個元素和刪除最後乙個元素花費的時間代價是不一樣的,刪除列表的第乙個元素,那麼在它之後的所有元素都要進行移動。所以當列表特別長的時候,這個代價就比較明顯了。我們本文介紹的迴圈佇列可以避免這個問題,同樣我們上篇文章提到的用鍊錶實現的方法也可以避免。
下面,我們來介紹迴圈佇列。
循壞佇列
迴圈佇列,就是將普通的佇列首尾連線起來, 形成乙個環狀,並分別設定首尾指標,用來指明佇列的頭和尾。每當我們插入乙個元素,尾指標就向後移動一位,當然,在這裡我們佇列的最大長度是提前定義好的,當我們彈出乙個元素,頭指標就向後移動一位。
這樣,列表中就不存在刪除操作,只有修改操作,從而避免了刪除前面節點造成的代價大的問題。
好,話不多說,我們用**來實現一下
class loopqueue:
def __init__(self, length):
self.head = 0
self.tail = 0
self.maxsize = length
self.cnt = 0
self.__list = [none]*length
這裡同樣,我們www.cppcns.com定義乙個佇列類,在例項化迴圈佇列的時候,要求指定佇列的大小,除了首尾指標以及佇列最大長度之外,我們還聲程式設計客棧明乙個表示佇列當前長度的屬性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 = www.cppcns.com0
www.cppcns.com 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 實現資料結構-迴圈佇列的操作方法
本文位址:
資料結構 非迴圈鏈隊的c 實現
pragma once 非迴圈鏈隊 ifndef my head h define my head h include g code c myhead.h endif my head h template typename elemtype class linkqueue typedef queue...
python實現資料結構(五) 佇列實現
佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出的 first in first out 的線性表,簡稱fifo。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作!假設佇列是q a1,a2,an 那麼a1就是隊頭元素,而an是隊...
python 實現資料結構 lesson 2 佇列
佇列 queue 是較為容易理解的概念,就像買票排隊一樣,先進先出,新來的人排到隊尾,最早到的人最先出列。如下 coding utf 8 classqueue object def init self size self.size size self.queue defget size self r...