1. 程式人生 > >7. 隊列(2)

7. 隊列(2)

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)