循环队列:解决顺序队列的假溢出问题

本文讲解了顺序队列假溢出问题的解决方案,引入循环队列的概念,通过初始化两个游标指针并调整入队和出队操作来提高效率。通过代码示例展示了如何在循环队列中实现动态扩容和删除操作,确保程序在频繁队列操作时的稳定性。
摘要由CSDN通过智能技术生成

上一篇博文,我们提到在使用顺序队列时出现的假溢出问题,今天我们就来谈谈如何解决顺序队列的假溢出问题。

循环队列

当进行动态创建队列的时候,也只不过是向后继续不断的申请内存空间,即时前面出队操作释放掉了前面的空间,但是指针依旧会向后进行移动,直到达到系统预留给程序的内存上界被强行终止,这对于极为频繁的队列操作和程序而言是致命的,这时候,就需要对我们的队列进行优化,使用更为优秀的结构——循环队列

初始化时直接创建两个游标指针,分别指向头结点和尾结点即可。
在这里插入图片描述
入队操作同顺序队列的方法,直接将rear向后移动即可,但是要注意判断,如果rear达到了队列的空间上限,将要从头节点继续开始移动

在这里插入图片描述
如果顺序队列的出队操作,直接将front进行后移一位即可,注意这时候有一个需要留意的地方,即队列是否为空,当队列为空的时候是无法进行出队操作的

接下来代码实现一下循环队列:

class Node(object):
    """结点类"""
    def __init__(self, item):
        """实例属性初始化和赋值"""
        self.item = item
        self.next = None


class Queue(object):
    def __init__(self, head=None, end=None):
        # 初始化头结点游标指针
        self.head = head
        # 初始化尾结点游标指针
        self.end = end

    def AddNode(self, item):
        """添加节点数据"""
        node = Node(item)
        # 队列为空的情况
        if self.head is None:
            self.head = node
            self.end = node
            return
        # 队列不为空的情况,每个队列都会有一个容量上限,假设我们循环队列容量为100
        if self.length() < 100:
            cur = self.end
            cur.next = node
            self.end = node
            return
        # 如果容量达到上限,尾结点的下一结点的链接域直接指向头结点
        else:
            cur = self.end
            cur.next = self.head
            return

    def RemoveNode(self):
        """删除节点数据"""
        # 队列特性,先进先出
        if self.head:
            cur = self.head
            self.head = cur.next
        return


    def length(self):
        """返回队列长度"""
        if self.head:
            # 构建游标和计数器
            cur = self.head
            count = 0
            # 循环查找下一结点,不存在则终止
            while cur is not None:
                cur = cur.next
                count += 1
            return count
        else:
            return 0


if __name__ == '__main__':
    q = Queue()
    print(q.length())
    for i in range(1, 111):
        if q.length() == 100:
            break
        else:
            q.AddNode(i)
    print(q.length())
    q.RemoveNode()
    print(q.length())


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值