循环队列(头尾相接的循环)

1.引出循环队列

解决上一篇博客当中:队列顺序存储结构出现的问题

现在通过将 rear 指针重新指向下标为 0 的位置,来解决上述问题

rear+1之后跑到了数组末尾后一位,现在想要其回到数组头部,使用取余操作即可将其归零
取余操作:
如果A<BA\lt BA<B则 A%B≠0A\%B\neq0A%B​=0,
如果 A>BA\gt BA>B则 A%B≠0A\%B\neq0A%B​=0,
所以只有当 A=BA=BA=B 时,A%B=0A\%B=0A%B=0,
所以可以用取余操作,将当前在数组末尾下一位的 rear 直接变为0

取余操作可以将大于A的值,经过取余运算后得到小于A的数值

如果向此数组中再填入两个元素,则 rear 指针会与 front 指针指向同一元素
下图中 rear = front 为原先判断队列满状态的条件

而原先判断队列空状态条件也为 rear = front


队列空和队列满的判断状态相同,均为 rear = front ,由此引出矛盾

为解决此矛盾,我们重新定义队列满状态

定义队列满状态(仅含一个空闲的存储单元)
(1)rear 在 front 的左侧

(1)rear 在 front 的右侧

队列满的判断条件

(rear + 1)%QueueSize == front
(其中rear、front为其所指数组的下标值)

rear+1之后跑到了数组末尾后一位,现在想要其回到数组头部,使用取余操作即可将其归零
取余操作:
如果A<BA\lt BA<B则 A%B≠0A\%B\neq0A%B​=0,
如果 A>BA\gt BA>B则 A%B≠0A\%B\neq0A%B​=0,
所以只有当 A=BA=BA=B 时,A%B=0A\%B=0A%B=0,
所以可以用取余操作判断当前指针是否指向指定位置,即可判断是否队满

举例:
情况一:rear >\gt> front

QueueSize = 5,rear = 4,front = 0
(4 + 1)%5 = 0 = front ,由此判断该队列处于满状态

QueueSize = 5,rear = 4,front = 2
(4 + 1)%5 = 0 ≠\ne​= front = 2 ,由此判断该队列处于不满状态

情况二:rear <\lt< front

QueueSize = 5,rear = 0,front = 2
(0 + 1)%5 = 1 ≠\ne​= 2 = front,由此判断该队列处于不满状态

QueueSize = 5,rear = 1,front = 2
(1 + 1)%5 = 2 =front ,由此判断该队列处于满状态

通用的计算队列长度的公式:

(rear - front + QueueSize)%QueueSize

2.循环队列的初始化

初始化就是动态分配一个预定义大小为 MAXQSIZE 的数组空间

Status InitQueue(SqQueue &Q){Q.base = new QElemType[MAXQSIZE];  //base指向数组空间的首地址if(!Q.base)exit(OVERFLOW);Q.front = Q.rear = 0;   //front和rear的值为数组下标值//头指针和尾指针置0,队列为空return OK;
}

3.求队列的长度

通用的计算队列长度的公式:
(rear - front + QueueSize)%QueueSize

int QueueLength(SqQueue Q){return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

4.循环队列的入队操作

在队尾插入一个新元素

Status EnQueue(SqQueue &Q, QElemType e){if((Q.rear+1)%MAXQSIZE == Q.front)    //判断是否队满return ERROR;Q.base[Q.rear] = e; //将元素e添加至数组base下标为rear的位置中Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针加1,取余运算的目的是防止数组越界,达到循环目的return OK;
}

5.循环队列的出队操作

将队头元素删除

Status DeQueue(SqQueue &Q, QElemType &e){if(Q.front == Q.rear) //队空return ERROR;e = Q.base[Q.front];  //将队头元素赋值给元素eQ.front = (Q.front + 1) % MAXQSIZE;  //将数组队头指针加1
}

6.取出循环队列的队头元素

SElemType GetHead(SqQueue Q){if(Q.front != Q.rear)  //队列非空return Q.base[Q.front];   //返回队头元素的值
}

循环队列(队列头尾相接的顺序存储结构)相关推荐

  1. C++编程练习(5)----“实现简单的循环队列的顺序存储结构“

    队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出(First In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端 ...

  2. 队列的定义、循环队列的顺序存储结构及链式存储结构

    文章目录 1 队列的定义 1.1 文字定义 1.2 代码定义 2 循环队列 2.1 循环队列的定义 2.2 循环队列的顺序存储结构 3 队列的链式存储结构 3.1 链队列的入队操作 3.2 链队列的出 ...

  3. 循环队列 - 顺序存储结构

    队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.是一种先进先出的线性表(FIFO).允许插入的一端称为队尾,允许删除的一端称为队头.我们在<栈的顺序存储结构> ...

  4. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

  5. 数据结构(C语言第二版)严蔚敏编,数据结构电子教材,线性表,栈,队列,顺序存储结构,初始化,入栈,出栈,入队,出队,c++

    前言 提示:本篇文章收录严蔚敏编写的数据结构C语言版本 简单介绍一下顺序表,顺序栈,循环队列,的顺序存储结构之间的区别 代码参考严蔚敏编写的<数据结构>,二维码动态演示可扫码可观看. - ...

  6. 字符串队列c语言,C语言实现循环队列(队列可存储字符串)

    项目原因,需要写一个队列来存储串口实时输出的字符串.看了网上很多博文和一些数据结构的数据,给的例子都是实现对单个数字或者字符的队列操作,并没有实现在队列中存储字符串.这里分享一种可以实现的方法. 关于 ...

  7. 第二章 栈和队列(1)——顺序存储

    第二章 栈和队列(1)--顺序存储 1.栈(Stack):是一种特殊的线性表(数据元素之间的关系是线性关系),其插入.删除只能在表的一端进行,另一端固定不动. 2.术语: 栈顶(top):插入.删除的 ...

  8. 队列的链式存储结构及实现

    队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点.如果 空队列时,front和re ...

  9. 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)

    // algo3-11.cpp 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径) #include"c1.h" #include"func3-1.cpp" ...

最新文章

  1. 软件开发和产品经理到底是怎么回事
  2. 解压与压缩(把dataset转为string、、 )
  3. 谭浩强课后题之----求最大公约数和最小公倍数
  4. silverlight 和内嵌页面进行交互的方法
  5. java接收并存储文件_客户端读取本地文件的数据,发送到服务器,服务器接收并存储到文件中...
  6. sql选择性插入_SQL插入选择
  7. php中轮转图片js代码,纯JavaScript手写图片轮播代码
  8. sprintf函数的用法linux,Linux 常用函数——sprintf函数
  9. 向量的二范数平方求导
  10. 单体架构常用注解合集
  11. 拉普拉斯变换的matlab仿真,拉普拉斯变换的Matlab求解方法
  12. python天天向上的力量实验报告_Python练习11:天天向上的力量
  13. 虚拟WIFI软件测试工程师,【Wifi测试工程师是什么职位】中互联zhl.com2021年Wifi测试工程师待遇怎么样-看准网...
  14. java 自定义表达式_自定义 Java Lambda
  15. 炫酷粒子表白,双十一脱单靠它了!
  16. 远程开机:一个简单的嵌入式项目开发
  17. css情景动画,css3中的动画属性animation应用场景及编写代码教程
  18. JavaScript变量提升(Hoisting)详解
  19. ELF可执行文件的理解
  20. AutoCAD帮助文档下载

热门文章

  1. 10% building 2/5 modules 3 active ...lib\index.js!/路径报错
  2. 我的世界java播放背景音乐_我的世界BOSS音乐mod
  3. Windows控制台基本操作命令
  4. python symbols函数_有限元平面四边形等差单元python编程
  5. Go:DepthFirstSearch深度优先搜索算法(附完整源码)
  6. ArrayList练习,随机数导入集合list内,方法实现偶奇数筛选
  7. Gmail邮箱怎么获取授权码?熟悉一下
  8. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)
  9. 【转】跨终端实践-天猫试戴的解决方案
  10. 旋转矩阵、欧拉角、四元数理论及其转换关系