上面用單鏈表實現隊列,這裏用數組實現隊列:python
須要兩個指針:head和tail數組
head=0,tail=0 兩個指針默認是0,都指向數組的首部bash
PUSH操做:ide
每當push的時候,只要將head當前指向的位置賦新值,使head前移就能夠spa
如圖,實現數組的push操做:3d
push 0 的時候,將head當前指向的賦爲0,將head前移指針
push 1 的時候,將head當前指向的賦爲1,將head前移blog
...隊列
POP操做:ci
隊列是先進先出的,應該0先出來
如上圖:
pop操做也是從首部開始,
先pop( )將tail的值拿出來,return 0,將tail前移;
再pop( )將tail的值拿出來,return 1,將tail前移。
以上,經過這兩個數組指針的前移操做,實現數組的隊列,可是必需要保證Queue的長度,即 len(Queue) <= array_size;
若是隊列已經到頭了,只要回來就好了,從新賦值,以下圖:
只要用一個取模(餘)操做,比上數組的size,就能讓隊列從新回來賦值。
公式:h % array_size
將用到以前構建的數組Array()的類,到數組隊列中去:
代碼以下:
class ArrayQueue(object): def __init__(self, maxsize): self.maxsize = maxsize self.array = Array(maxsize) #底層實現是Array類 self.head = 0 self.tail = 0 #須要兩個指針節點,標記頭和尾的位置 def push(self, value): if len(self) >= self.maxsize: raise Exception('Queue Full') self.array[self.head % self.maxsize] = value self.head += 1 #前移頭指針 def pop(self): value = self.array[self.tail % self.maxsize] self.tail += 1 return value def test_array_queue(): import pytest #引入pytest size = 5 #定義szie=5 q = ArrayQueue(size) #定義長度爲size的隊列 for i in range(size): #循環從0到4的中間數據調用 q.push(i) with pytest.raises(Exception) as excinfo: #判斷異常是否生效,當隊列滿了就會出現異常 q.push(size) assert 'Queue Full' in str(excinfo.value) assert len(q) == size #斷言當前q隊列的長度等於size的值,一被push滿 assert q.pop() == 0 #先進先出,第一個出來的是0 assert q.pop() == 1 q.push(5) #再push一個5進入隊列 assert len(q) == 4 assert q.pop() == 2 assert q.pop() == 3 assert q.pop() == 4 assert q.pop() == 5 assert len(q) == 0
編寫test.sh文件,以前安裝了when-changed
#!/bin/bash when-changed -v -r -1 -S ./ "py.test -s $1"
#test.sh array_queue.py