7. 队列(2)

上面用单链表实现队列,这里用数组实现队列:

需要两个指针:head和tail

head=0,tail=0 两个指针默认是0,都指向数组的首部

image.png


PUSH操作:

每当push的时候,只要将head当前指向的位置赋新值,使head前移就可以

image.png

如图,实现数组的push操作:

push 0 的时候,将head当前指向的赋为0,将head前移

push 1 的时候,将head当前指向的赋为1,将head前移

...



POP操作:

队列是先进先出的,应该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

猜你喜欢

转载自blog.51cto.com/286577399/2150679