7. 隊列(2)

上面用單鏈表實現隊列,這裏用數組實現隊列:python

須要兩個指針:head和tail數組

head=0,tail=0 兩個指針默認是0,都指向數組的首部bash

image.png


PUSH操做:ide

每當push的時候,只要將head當前指向的位置賦新值,使head前移就能夠spa

image.png

如圖,實現數組的push操做:3d

push 0 的時候,將head當前指向的賦爲0,將head前移指針

push 1 的時候,將head當前指向的賦爲1,將head前移blog

...隊列



POP操做:ci

隊列是先進先出的,應該0先出來

image.png

如上圖:

pop操做也是從首部開始,

先pop( )將tail的值拿出來,return 0,將tail前移;

再pop( )將tail的值拿出來,return 1,將tail前移。


以上,經過這兩個數組指針的前移操做,實現數組的隊列,可是必需要保證Queue的長度,即 len(Queue) <= array_size;

若是隊列已經到頭了,只要回來就好了,從新賦值,以下圖:

image.png

只要用一個取模(餘)操做,比上數組的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

相關文章
相關標籤/搜索