[C/C++]数据结构 循环队列
前言:
队列是一种具有先进先出特性的结构,但是当数据出队列以后,前面的空间就无法再次利用了,循环队列就可以解决这个问题
一:概念及结构:
1.循环队列概念
循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.
2.循环队列结构
循环队列可以使用数组实现也可以使用链表实现,但是还是建议使用数组实现.另外在给数组开辟空间时,要比队列实际长度多一个,如果开辟空间和队列存储数据的长度一样的话,在判断队列为空和队列为满时,两者都为 front==rear 会出现一样的情况导致无法判断,如

所以必须多开辟一个空间,这个空间不存储数据,这样就可以区分出两种情况

结构定义:
front用于维护队头,指向队头元素位置,back用于维护队尾,总是指向队尾元素的下一个位置,k表示队列实际存数据的长度
ps:循环队列的长度是固定的
typedef struct {int *a;int front; int back;int k; //队列大小
} MyCircularQueue;
二:功能实现
1.入队:
首先要判断队列是否已满,再进行入队的操作,入队操作需要考虑索引循环的问题,当索引越界,需要让它变成最小值
如果入队是这种情况,直接在队尾处插入数据,back++即可

但是如果碰到这种情况,back就不能简单加一就完事了了,还需要将back重新指向数组刚开始的空间,不然就体现不出循环的特点了

所以在队尾插入数据back++后,进行 back=(back)%(k+1) 就可以使back重新指向数组起始位置(这里要注意的是,我定义的k是队列不带多开辟的那一个空间的长度)
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))//入队前先判断是否还有空间return false;obj->a[obj->back]=value;obj->back++;obj->back%=(obj->k+1);return true;
}
2.出队:
首先判断队列是否为空,在进行出队操作,出队也需要考虑front的索引问题
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;obj->front++;obj->front%=(obj->k+1);return true;
}
3.取队头元素
front指向的就是队头元素
int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}
4.取队尾元素
由于back始终指向队尾的下一个元素,在一般情况下直接返回back-1所指向的元素即可,但是有一种特殊情况,如果此时back指向的是数组起始位置的话,访问back-1所指向的元素就会越界,所以这里也涉及循环的问题

方法一: 把特殊情况分离出来
int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;if(obj->back==0)return obj->a[obj->k];elsereturn obj->a[obj->back-1];
}
方法二: 两种情况统一处理
int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
}
5.判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front==obj->back;
}
6.判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back+1)%(obj->k+1)==obj->front;
}
7.销毁队列
void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);obj->front=obj->back=0;obj->k=0;
}
8.求队列当前元素个数
当back在front之后时,back-front就可获得当前队列元素个数,但是当back在front前面时,back+(k+1)
可以让back指向不处理循环问题本身应该指向的位置
int myCircularQueueSize(MyCircularQueue* obj) {return (obj->back+(k+1)-obj->front)%(k+1);
}
相关文章:
[C/C++]数据结构 循环队列
前言: 队列是一种具有先进先出特性的结构,但是当数据出队列以后,前面的空间就无法再次利用了,循环队列就可以解决这个问题 一:概念及结构: 1.循环队列概念 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队…...
Cache学习(2):Cache结构 命中与缺失 多级Cache结构 直接映射缓存
1 Cache名词解释 命中(hit): CPU要访问的数据在Cache中有缓存缺失(miss): CPU要访问的数据在Cache中没有缓存Cache Size:Cache的大小,代表Cache可以缓存最大数据的大小Cache Line&a…...
vue前端前端页面权限验证方式
在Vue应用中使用Vuex(Vue的状态管理库)来存储用户组(user group)和角色(roles)信息是一种合理的做法,特别是在涉及到权限管理和用户身份的情况下。Vuex提供了一个集中式的状态管理方案ÿ…...
jenkins springCloud项目优雅下线
文章目录 场景解决下线请求效果如图贴一个可用的部署脚本 场景 在 Spring Cloud 项目的微服务实例关闭时,需要首先从注册中心设置为下线,避免该服务的消费者继续请求该服务实例,导致请求失败如果我们在服务实例从注册中心取消注册后ÿ…...
indexOf
可以通過String的indexOf判斷是否包括某個字符。 SpringBootTest Slf4j class BaseApplicationTests {Testvoid contextLoads() {log.info("01".indexOf(".")"");log.info("0.1".indexOf(".")"");log.info("…...
STM32分区跳转问题
项目场景: 在OTA中,FLASH通常被划分为以下几种类型 bootloaderiapappbootloaderappapp保存区bootloaderapp1app2 不同的分区方式有不同的有点,但是共同点都是需要执行分区跳转 问题1描述 但在分区跳转过程中遇到过使用不同的编译器不能跳转…...
亿级流量架构服务降级
什么是服务降级 如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是服务降级呢? 简单来说就是,将一些不太重要的景区项目砍掉,平时就那么三五…...
【技术分享】RK3399 Ubuntu通过Python实现录音和播放功能
本文基于IDO-SBC3968 Ubuntu 系统通过Python脚本实现录音和播放功能。 IDO-SBC3968采用RK3399国产六核64位CPU高性能处理器,支持4K HDMI2.0显示,接口丰富,拥有千兆以太网,全协议TypeC接口,USB3.0 ,eDP 和…...
关于vs code Debug调试时候出现“找不到任务C/C++: g++.exe build active file” 解决方法
vs code Debug调试时候出现“找不到任务C/C: g.exe build active file” ,出现报错,Debug失败 后来经过摸索和上网查找资料解决问题 方法如下 在Vs code的操作页面左侧有几个配置文件 红框里的是需要将要修改的文件 查看tasks.json和launch.json框选&…...
交叉导轨在光学工作台起什么重要作用?
光学工作台常常需要承载和移动各种光学元件和仪器,如望远镜、显微镜、光谱仪等,这些设备需要在空间中进行精确的定位和稳定支撑,而交叉导轨作为一种高精度、高刚度的直线传动元件,为光学工作台提供了重要的支撑和导向。 1>交叉…...
易点易动固定资产管理系统:实现固定资产与财务系统的高效对接
在企业的日常运营中,固定资产的管理和财务账目的记录是两项不可或缺的任务。然而,由于传统的管理方式存在数据孤岛和信息不一致等问题,往往导致工作效率低下和管理混乱。为了解决这一问题,易点易动固定资产管理系统应运而生。该系…...
做亚马逊多久可以赚钱?做亚马逊需要多少资金?——站斧浏览器
做亚马逊需要时间、资金和全面的市场策略。创业者需要有耐心和决心,同时也要灵活应对市场变化。那么做亚马逊多久可以赚钱,做亚马逊需要多少资金。 做亚马逊多久可以赚钱 首先,就像任何其他生意一样,做亚马逊需要时间和努力来建立起稳定的客…...
计算机应用基础_错题集_基础知识---网络教育统考工作笔记006
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、基础知识部分错题集总结前言 计算机应用基础统考,错题集总结 一、基础知识部分 基础知识部分 2、微处理器芯片的位数即指______。 A.速度 B.字长 C....
C#面试题3
1.请解释一下C#中的并发编程和线程安全性。 并发编程是指在多线程环境下编写代码以实现并发执行的能力。C#提供了一些机制来支持并发编程,如线程、任务和并行循环等。线程安全性是指在多线程环境下,代码能够正确地处理共享数据并保持一致性。线程安全的代…...
MariaDB(基础信息)
文章目录 一、MariaDB1、基本信息2、存储引擎3、兼容性》MySQL、Postgres、MongoDB 和 Oracle4、直接连接其他数据源5、等等等。。。。。。。。。。。。。。。。。。。。。 二、操作和mysql一样参考文章 --------------------机翻内容仅供参考------------------------- 一、…...
SpringBoot + 通义千问 + 自定义React组件,支持EventStream数据解析!
一、前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 最近ChatGPT非常受欢迎,尤其是…...
Redis中文结果查看方式
背景 当使用redis时我们存储到缓存中可能会包含一些中文,例如下面命令 set test 中国 当执行查看时,发现客户端显示的并不是中文而是乱码,例如下面结果 get test \xe4\xb8\xad\xe5\x9b\xbd 现对【\xe4\xb8\xad\xe5\x9b\xbd】的查看有如下几个方式 方式一:通过客户端直…...
计算机组成原理-磁盘存储器
文章目录 总览外存储器磁盘存储器磁盘的性能指标磁盘地址磁盘的工作过程磁盘阵列 总结 总览 外存储器 磁盘存储器 写是利用电流产生磁场从而写磁盘 读是利用载磁体移动时产生的电场从而得到数据 磁性材质易受外界磁场干扰 下图中 载磁体上N S的前后顺序代表对应存储二进制的比…...
连接docker swarm和凌鲨
docker swarm相比k8s而言,部署和使用都要简单很多,比较适合中小研发团队。 通过连接docker swarm和凌鲨,可以让研发过程中的常用操作更加方便。 更新容器镜像调整部署规模查看日志运行命令 使用步骤 部署swarm proxy 你可以通过linksaas…...
Qt实现画的图片移动
要实现左键点击鼠标时图片跟着鼠标移动,可以通过以下步骤来实现:1. 在QGraphicsView的构造函数中设置鼠标跟踪属性,以便能够捕获鼠标事件。cpp QGraphicsView::QGraphicsView(QWidget *parent) : QGraphicsView(parent) {setMouseTracking(tr…...
从电容到内存条:手把手拆解一颗DRAM芯片的内部架构与工作流程
从电容到内存条:手把手拆解一颗DRAM芯片的内部架构与工作流程 当你双击电脑桌面上的程序图标时,操作系统会从硬盘加载程序到内存条中运行——这个看似简单的动作背后,隐藏着一场精密的电荷舞蹈。作为现代计算机的核心部件,DRAM&am…...
3大智能突破:重新定义百度网盘下载体验
3大智能突破:重新定义百度网盘下载体验 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾在深夜急需下载一份重要文件,却因百度网盘的限速而焦虑…...
终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间
终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中花费数十小时刷装备、反复练级&…...
LiquidAI LFM2-2.6B-GGUF教程:nvidia-smi监控GPU层卸载效果分析
LiquidAI LFM2-2.6B-GGUF教程:nvidia-smi监控GPU层卸载效果分析 1. 项目介绍 LFM2-2.6B-GGUF是由Liquid AI公司开发的大语言模型,经过GGUF量化处理后特别适合在资源有限的设备上运行。这个模型最吸引人的特点是它的小体积和高效能表现。 1.1 核心优势…...
Cursor智能体:让AI代码助手学会自我进化与个性化适配
1. 项目概述:当AI代码助手学会“自我进化”如果你和我一样,每天都在和代码编辑器打交道,那么Cursor这款基于AI的智能编辑器,很可能已经是你工作流中不可或缺的一部分了。它通过深度理解上下文,能帮你生成代码、重构函数…...
如何开发Shuttle播放器插件:从入门到实战的完整指南
如何开发Shuttle播放器插件:从入门到实战的完整指南 【免费下载链接】Shuttle Shuttle Music Player 项目地址: https://gitcode.com/gh_mirrors/shut/Shuttle Shuttle Music Player是一款功能强大的开源音乐播放器,支持自定义插件扩展功能。本文…...
别再只会用kafka-topics.sh了!这5个Kafka命令行实战场景,运维和开发都得会
别再只会用kafka-topics.sh了!这5个Kafka命令行实战场景,运维和开发都得会 Kafka作为现代数据管道的核心组件,其命令行工具远不止于基础的topic管理。真正的高手往往能在故障排查、性能调优等关键时刻,通过命令行组合拳快速定位问…...
WeDLM-7B-BBase助力开源:自动为OpenSource项目生成高质量README与文档
WeDLM-7B-BBase助力开源:自动为OpenSource项目生成高质量README与文档 1. 开源项目的文档困境 每个开源项目维护者都深有体会:写代码容易,写文档难。当你花了几周时间开发出一个功能强大的开源项目,最后却要花同样多的时间来撰写…...
git下载与安装教程
Git下载与安装教程 一、下载Git 访问官网 打开Git官方网站下载:Git - Install (注:官网界面可能更新,核心下载区域位置不变) 选择系统版本 Windows用户:点击"Download for Windows"按钮macOS用…...
SciPy优化算法实践:从本地搜索到全局优化
1. SciPy优化算法概述在科学计算和工程应用中,函数优化是一个基础而重要的问题。简单来说,优化就是寻找使目标函数取得最小值或最大值的输入参数。Python的SciPy库为我们提供了一套完整的优化工具集,涵盖了从简单的一维搜索到复杂的多维全局优…...
