7. 隊列(2)
阿新 • • 發佈:2018-07-26
n) maxsize 文件 raise queue () val .com 公式 上面用單鏈表實現隊列,這裏用數組實現隊列:
需要兩個指針:head和tail
head=0,tail=0 兩個指針默認是0,都指向數組的首部
PUSH操作:
每當push的時候,只要將head當前指向的位置賦新值,使head前移就可以
如圖,實現數組的push操作:
push 0 的時候,將head當前指向的賦為0,將head前移
push 1 的時候,將head當前指向的賦為1,將head前移
...
POP操作:
隊列是先進先出的,應該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
7. 隊列(2)