数组(用数组实现队列)

# -*-coding:utf-8-*-
class Array(object):

    def __init__(self, size=32):
        self._size = size
        self._item = [None] * size

    def __getitem__(self, index):
        return self._item[index]

    def __setitem__(self, index, value):
        self._item[index] = value

    def __len__(self):
        return self._size

    def clear(self):
        for i in range(len(self._item)):
            self._item[i] = None

    def __iter__(self):
        for item in self._item:
            yield item

####################################################
# 实现队列  Queue
####################################################


class FullError(Exception):
    pass


class EmptyError(Exception):
    pass

class ArrayQueue():
    def __init__(self, maxsize):
        self.maxsize = maxsize
        self.head = 0
        self.tail = 0
        self.array = Array()

    def push(self, value):
        if len(self) >= self.maxsize:
            raise FullError("queue full")
        self.array[self.head % self.maxsize] = value
        self.head += 1

    def pop(self):
        if not len(self):
            raise EmptyError("queue empty")
        value = self.array[self.tail % self.maxsize]
        self.tail += 1
        return value

    def __len__(self):
        return self.head - self.tail


"""数组实现队列 单测"""

def test_array_queue():
    maxsize = 3
    q = ArrayQueue(maxsize)
    for i in range(maxsize):
        q.push(i)

    assert len(q) == 3

    import pytest
    with pytest.raises(FullError) as Err_info:
        q.push(3)
    assert "queue full" in str(Err_info.value)

    q.pop()
    assert len(q) == 2

    q.pop()
    q.pop()

    with pytest.raises(EmptyError) as empty_info:
        q.pop()
    assert "empty" in str(empty_info.value)
    q.push(2)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容