06.队列

class QueueUnderflow(ValueError):
    """队列为空"""
    pass


class SQueue:
    def __init__(self, init_len=5):
        self._len = init_len  # 存储区长度
        self._elems = [0] * init_len  # 元素存储
        self._head = 0  # 表头元素下标
        self._num = 0  # 元素个数

    def is_empty(self):
        return self._num == 0

    def peek(self):
        """查看队头元素"""
        if self._num == 0:
            raise QueueUnderflow
        return self._elems[self._head]

    def dequeue(self):
        """出队"""
        if self._num == 0:
            raise QueueUnderflow
        e = self._elems[self._head]
        self._head = (self._head + 1) % self._len
        self._num -= 1
        return e

    def enqueue(self, e):
        """入队"""
        if self._head == self._len - 1:
            self._extend()
        self._elems[(self._head + self._num) % self._len] = e
        self._num += 1

    def _extend(self):
        """扩容操作"""
        old_len = self._len
        self._len *= 2
        new_elems = [0] * self._len
        for i in range(old_len):
            new_elems[i] = self._elems[(self._head + i) % old_len]
        self._elems, self._head = new_elems, 0

    def print(self):
        """打印从队头开始"""
        end = self._head + self._num
        print("list:", self._elems[self._head:end])

猜你喜欢

转载自www.cnblogs.com/fly-book/p/11720129.html