数据结构——图解循环队列长度计算问题

2023-11-17

队列定义是这样的

#define MAXSIZE 10
typedef struct{
	ElemType data[MAXSIZE];
	int front,rear;
} SeqQueue;

一个队列 = 一个存放元素的数组 + 一个队头指针 + 一个队尾指针

front:控制出队
rear:控制入队

我们先做个规定:
front指向队头元素
rear指向队尾元素的下一个元素(当然也可以让它直接指向队尾元素,只是在某些代码上需要相应的改动,但思想不变)

初始我们让rear = front = data[0]

元素出队:front++
元素入队:rear++

一直rear++便到达索引最大的位置,这个时候队列就满了不能再入队元素了吗?

并不,如果同时也一直有元素出队,那么还是有空闲位置可以继续入队的,那要怎么表示呢?

于是就出现了循环队列,这个类比时钟就很好理解
在这里插入图片描述

时钟的指针到达12之后就会归0,周而复始再次循环

所以出入队指针的变化就可以表示成

元素出队:(front+1)% maxSize
元素入队:(rear+1)% maxSize

那此时的队列的长度怎么获取呢?
那就不是单纯的rear - front了,看图
在这里插入图片描述
队列长度计算公式:
( r e a r − f r o n t + m a x S i z e ) % m a x S i z e ( rear - front + maxSize)\% maxSize rearfront+maxSize%maxSize

+maxSize:目的是防止rear - front < 0
%maxSize:目的是防止当rear - front > 0时,又+ maxSize导致队列长度>maxSize

回答一下评论中的问题
为什么会rear - front < 0?
一个队列的初始状态如下图
在这里插入图片描述
当不断插入新元素时,rear指针也不断向后,直到队列末尾。
在这里插入图片描述
但这只展示了只有元素入队的情况,如果同时有元素出队呢?此时front指针也会后移在这里插入图片描述
所以说当rear指针已经到队列末尾时,其实队列还没满,因为有元素出队了,所以依旧可以有新元素入队,但是此时只能从前面空位插入
在这里插入图片描述所以才会有rear-front<0的情况,其实相当于我们将队列首尾连接,变成一个循环队列,使得队列空间可重复利用。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——图解循环队列长度计算问题 的相关文章

随机推荐

  • 【OpenCV学习笔记】【教程翻译】五 (车牌识别之OCR分割)

    车牌识别 车牌识别的第二步主要是提取出车牌中的字符 对于每个被检测出的车牌 我们对车牌进行分割获取每个字符 然后用神经网络机器学习算法实现字符的识别 在这个过程中 我们也可以学习到如何评估一个分类算法 OCR分割 首先 我们将车牌图像作为具
  • sqli-labs 21——40关攻略

    Less 21 基于错误的复杂的字符型Cookie注入 base64编码 单引号 报错型 cookie型注入 本关和less 20相似 只是cookie的uname值经过base64编码了 登录后页面 圈出来的地方显然是base64加密过的
  • 浅谈Linux的文件系统, 新增XFS.Ext3.GFS.ReiserFS.JFS相关知识

    如果您是一位新手 也许 您还不知道如何把文件从Windows拷贝到 Linux上吧 下面 我们将说明Unix文件系统以及mount的工作过程 然后再比较详细地讨论 mount的使用和有关选项 如果您已经了解Unix文件系统是如何工作的 那么
  • debug调试神器pysnooper

    异常bug定位 print 函数也可以 但效率上还是慢 后来发现了一个叫PySnooper的装饰器 一般debug调试 都是在我们可能觉得会有问题的地方 去打印输出 看下实际输出了什么 然后思考问题所在 下载库 pip install py
  • python3 练习题100例 (十二)

    题目十二 打印出所有的 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个 水仙花数 因为153 1的三次方 5的三次方 3的三次方 usr bin env python3 coding utf 8
  • “ModuleNotFoundError: No module named sklearn”解决办法

    最近在跑实验的时候 需要导入sklearn 但是运行代码一直提示 ModuleNotFoundError No module named sklearn 实验中导入sklearn的代码 from sklearn import metrics
  • Linux CentOS7 中 完美解决VMTools失效,windows 与 Liunx间完美复制文件,无报错的解决方案

    问题 我也是才刚使用CentOS7没多久 搭建好环境后出现比较头疼的问题就是 Windows 和 Linux 之间无法复制粘贴文本和文件 这个问题只要在虚拟机中安装 VMTools 就能解决 但是不知道什么原因导致 我在CentOS 6 8
  • Linux 狂神说学习笔记

    狂神说linux Linux 基本目录 目录相关命令 文件属性 查看文件 硬链接和软链接 vim 账号管理 用户组管理 磁盘管理 进程管理 环境安装 基本目录 目录相关命令 ls al 列出目录 a所有文件包括隐藏文件 l列出所有文件包括文
  • MyBatis ognl.NoSuchPropertyException 或者 Invalid bound statement (not found)

    描述 SpringBoot Mybatis plus 项目 运行时出现如下错误 ognl NoSuchPropertyException 没有对应属性异常 Invalid bound statement not found 绑定语句无效 未
  • 问题小结(3)-dialog标题居中

    dialog标题居中问题 用系统的AlertDialog Builder创建dialog时 如果需要将dialog的title居中显示 需要调用 setCustomTitle View view 方法 对需要设置的view设置居中的相关属性
  • zookeeper 分布式共享锁的流程图

    1分布式共享锁的流程图 原理 package cn itcast bigdata zklock import java util Collections import java util List import java util Rand
  • 水球图 及各种参数设置

    水球图 Liquid Fill Chart 是Echarts的一个插件 在官方文档中没有 可以用来优雅的展示百分比数据 水球图 gif 安装 HTML中引入水球图
  • docker基础1——架构组成、安装配置

    文章目录 一 发展起源 1 1 传统虚拟化与容器虚拟化 1 2 docker底层核心技术 1 2 1 命名空间 1 2 2 控制组 1 3 docker工作方式 1 4 docker容器编排 1 5 docker优劣势 1 6 docker
  • iframe的替代品

    面试题 使用过iframe框架 那你对于iframe框架的优缺点知道多少 并且由于iframe的一些缺点 国内外针对这个框架的替代品你知道有哪些呢 知识点1 iframe框架的优缺点 优点 1 可以跨域请求其他网站 并将网站完整展示出来 2
  • [课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习

    作者最近在复习考博 乘此机会分享一些计算机科学与技术 软件工程等相关专业课程考题 一方面分享给考研 考博 找工作的博友 另一方面也是自己今后完成这些课程的复习资料 同时也是在线笔记 基础知识 希望对您有所帮助 不喜勿喷 无知 乐观 低调 谦
  • 【Qt Modbus通信】QModbus实现modbus的主机功能 源码分享

    前言 modbus在上下位机数据交互时被广泛使用 因此写了这篇笔记和大家一起学习 Qt Modbus通信 libmodbus实现modbus的主机功能 从机功能 源码分享 之前使用libmodbus实现了modbus的主从功能 但发现主机查
  • docker frp 搭建内网穿透

    docker frp 搭建内网穿透 可运行的云服务器 docker pull snowdreamtech frps mkdir p root docker frp cd root docker frp touch frps ini comm
  • 企业微信如何简单实现定时发送文件到群:企业微信群机器人操作(Java代码实现)

    前言 不知道小伙伴们的公司组织架构通勤用的啥软件 我公司用的企业微信 然后业务销售部那边需要每天统计销售数据报表然后发在群里 我是开发 我不配在群里 知道这个背景以后 产品给我们的需求是 直接统计数据按照业务那边的报表模板直接生成销售报表
  • ARM-A架构入门基础(三)MMU

    14天学习训练营导师课程 周贺贺 ARMv8 ARMv9架构 快速入门 1 MMU Memory Management Unit 内存管理单元 MMU的意义在于将软件程序的虚拟地址转换为真实的物理地址 2 MMU种类 Secure EL1
  • 数据结构——图解循环队列长度计算问题

    队列定义是这样的 define MAXSIZE 10 typedef struct ElemType data MAXSIZE int front rear SeqQueue 一个队列 一个存放元素的数组 一个队头指针 一个队尾指针 fro