今天咱們來到了循環隊列這一節,以前的文章中,我介紹過了用python自帶的列表來實現隊列,這是最簡單的實現方法。html
可是,咱們都知道,在列表中刪除第一個元素和刪除最後一個元素花費的時間代價是不同的,刪除列表的第一個元素,那麼在它以後的全部元素都要進行移動。因此當列表特別長的時候,這個代價就比較明顯了。咱們本文介紹的循環隊列能夠避免這個問題,一樣咱們上篇文章提到的用鏈表實現的方法也能夠避免。python
下面,咱們來介紹循環隊列。函數
循環隊列,就是將普通的隊列首尾鏈接起來, 造成一個環狀,並分別設置首尾指針,用來指明隊列的頭和尾。每當咱們插入一個元素,尾指針就向後移動一位,固然,在這裏咱們隊列的最大長度是提早定義好的,當咱們彈出一個元素,頭指針就向後移動一位。oop
這樣,列表中就不存在刪除操做,只有修改操做,從而避免了刪除前面節點形成的代價大的問題。指針
好,話很少說,咱們用代碼來實現一下code
class Loopqueue: def __init__(self, length): self.head = 0 self.tail = 0 self.maxSize = length self.cnt = 0 self.__list = [None]*length
這裏一樣,咱們定義一個隊列類,在實例化循環隊列的時候,要求指定隊列的大小,除了首尾指針以及隊列最大長度以外,咱們還聲明一個表示隊列當前長度的屬性cnt。htm
接下來咱們給隊列增長一些操做:blog
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
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,咱們的循環隊列類就定義好了,若是你看過介紹隊列的文章,就會發現循環隊列和普通隊列的操做在邏輯上仍是有一些類似的。隊列
代碼並不難,相信你已經徹底理解了,本身動手操做一下吧。get
你還了解哪些隊列類型呢?留言告訴我吧。