美文网首页
数据结构-5.队列-循环队列

数据结构-5.队列-循环队列

作者: 爱吃火锅的金先生 | 来源:发表于2020-06-23 13:45 被阅读0次

使用循环队列来解决“假溢出”问题:

其实,并没有真正的环,只是用环作为类比(用长方形也可以得出同样的结论)

思路一:牺牲一个存储空间来避免冲突

首先,重新定义 front 和 rear 的定义

定义 front 为第一个元素对应的索引,可以理解为每次取出的元素位置

定义 rear 为最后一个元素的下一个元素对应的索引,可以理解为每次放入元素的位置

首先初始化队列

初始化队列,front == rear == 0 插入 ABCDEFGH 后,队列满,删除 ABCDEFGH 后,队列为空,此时 front == rear == 0

此时无法区分队列空和队列满状态,因为 rear == front 在两种情况下都成立,这意味着,无论使用何种运算方法,都无法将二者区分开。解决办法就是牺牲一个存储单位

插入 ABCDEFG 后,队列空出一个空位,删除 ABCDEFG后,队列为空

队列满时,用取模运算来判断位置 (rear + 1) % maxSize == front,则认为队列已满

队列中的有效数据个数为

(1)当 rear 比 front 大的时候,有效数据个数为 rear - front

(2)当 rear 比 front 小的时候,说明已经使用过一圈的容量了,rear + maxSize - front

总结起来为:

    (rear - front + maxSize) % maxSize

队列空时,用相等来判断 rear == front,则认为队列已空

代码实现:

相同的成员变量,不同的构造方法,注意 front 和 rear 含义的变化 为了避免冲突,而牺牲一个存储空间,导致判断队列满和队列空的变化 由于 rear 变为最后一个元素的后一个位置,直接将元素插到该位置,注意使用模运算来避免可能的索引越界 由于 front 变为第一个元素的位置,直接取得该位置的元素,注意使用模运算来避免可能的索引越界 显示队列中的有效元素,即 front 及以后 (rear + maxSize - front) % maxSize 个元素,注意使用模运算来避免可能的索引越界 查看首元素的方法

思路二:设置一个计数数据

设置一个 num,来表示队列中当前的有效数据,初始化时,其值为 0

每当有一个数据成功进入队列时,num + 1

每当有一个数据成功取出队列时,num - 1

则队列为满的时候:

rear == front == num > 0

则队列为空的时候:

num == 0

思路三:设置一个标志变量

设置一个 flag,初始值为 0

当有数据成功计入队列时,队列中有数据,flag 的值就是 1

当所有数据都被取出队列时,队列中没有数据,flag 的值就是 0

则队列为满的时候:

rear == front && flag == 1

则队列为空的时候:

rear == front && flag == 0

思路一是通过牺牲存储空间来实现的,思路二和思路三可以不牺牲空间,提倡思路三,因为在不牺牲空间的同时,掌握了队列中的有效数据个数

相关文章

  • 数据结构-队列(Queue)-FIFO

    数据结构-队列(Queue)-FIFO 队列的接口设计 双端队列-Deque 循环队列-CircleQueue 双...

  • 数据结构-5.队列-循环队列

    使用循环队列来解决“假溢出”问题: 其实,并没有真正的环,只是用环作为类比(用长方形也可以得出同样的结论) 思路一...

  • LeetCode 622. 设计循环队列

    622. 设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原...

  • 数据结构之队列

    一.循环队列 1.构建结构 2.初始化队列 3.清空队列 4.判断是否为空队列 5.获取队列的长度 6.便利队列 ...

  • leetcode622.设计循环队列

    题目链接 题解: 在我的文章数据结构之——队列与循环队列 中,有关于循环队列的设计,包括本题没有考虑过的resiz...

  • C语言数据结构——线性表链式循环队列(链表实现方式)

    队列相关知识及操作请参看上一章 C语言数据结构——线性表循环队列(动态数组实现方式) 一、链式队列 链式队列 : ...

  • java.util.ArrayDeque源码解析

    准备知识 因为ArrayDeque使用了循环队列,所以首先要了解循环队列数据结构的原理。https://www.j...

  • 常见的数据结构

    常见的数据结构有: 数组 链表单链表、双向链表、循环链表、双向循环链表、静态链表 栈顺序栈、链式栈 队列普通队列、...

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 集合知识点整理

    1.前言:数据结构——队列 队列接口先说明有哪些功能,但不说是如何实现的,队列有两种实现方式: 循环数组 链表 循...

网友评论

      本文标题:数据结构-5.队列-循环队列

      本文链接:https://www.haomeiwen.com/subject/kqmwtktx.html