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

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

循环队列

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

初始化时直接创建两个游标指针,分别指向头结点和尾结点即可。
循环队列:解决顺序队列的假溢出问题_第1张图片
入队操作同顺序队列的方法,直接将rear向后移动即可,但是要注意判断,如果rear达到了队列的空间上限,将要从头节点继续开始移动

循环队列:解决顺序队列的假溢出问题_第2张图片
如果顺序队列的出队操作,直接将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())


你可能感兴趣的:(数据结构,队列,链表,数据结构,算法,java)