标签:rgb tle 两个指针 指针 ini $1 oss bash 断言
上面用单链表实现队列,这里用数组实现队列:需要两个指针: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
标签:rgb tle 两个指针 指针 ini $1 oss bash 断言
原文地址:http://blog.51cto.com/286577399/2150679