Python基于顺序结构实现循环队列Queue

参考《大话数据结构》4.12一节,基于顺序结构实现了循环队列。

  • 在循环队列中,队列为空时,头指针与尾指针值相等;
  • 队列满时,存在两种情况:
    • 尾指针在头指针后,此时,rear + 1 - Queue_Size = front
    • 尾指针在头指针前,此时,rear + 1 = front
  • 队列满时,可以统一用下述公式判断:(rear + 1) % Queue_Size = front
    循环队列相比单纯的顺序存储,时间性能较好,入队和出队均为O(1)。
    但仍然面临着数组可能会溢出的问题,而链式存储结构无需担心队列长度,因此下一篇博客将基于链式存储结构实现队列。
class SeqQueue(object):
    def __init__(self, size=10):
        self.MAXSIZE = size
        self.data = [' '] * size
        self.front = 0  # 头指针
        self.rear = 0  # 尾指针

    def __len__(self):
        return (self.rear - self.front + self.MAXSIZE) % self.MAXSIZE  # 返回队列实际大小

    def __str__(self):
        s = ''
        head = self.front
        tail = self.rear
        while head != tail:
            s += '%s ' % self.data[head]
            head = (head + 1) % self.MAXSIZE
        return s

    def enqueue(self, value):
        # 判断队列是否已满
        if (self.rear + 1) % self.MAXSIZE == self.front:
            raise OverflowError('当前队列已满,无法添加数据!')
        self.data[self.rear] = value
        self.rear = (self.rear + 1) % self.MAXSIZE
        return True

    def dequeue(self):
        # 判断队列是否为空
        if self.front == self.rear:
            raise OverflowError('当前队列为空!')
        value = self.data[self.front]
        self.front = (self.front + 1) % self.MAXSIZE
        return value


if __name__ == '__main__':
    q = SeqQueue(20)
    q.enqueue(10)
    q.enqueue(14)
    q.enqueue(33)
    print(q)
    q.dequeue()
    q.dequeue()
    print(q)

以上,欢迎交流指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值