数据结构——循环队列

目录

循环队列的基本知识

循环队列的实现

定义

各个接口的实现


循环队列的基本知识

循环队列的定义

循环队列(Circular Queue)是一种使用固定大小的数组实现的队列,它将数组的首尾相连,形成环形,以充分利用空间并实现高效的入队(enqueue)和出队(dequeue)操作。

基本特点

  • 固定大小:循环队列通常有一个固定的大小,这意味着它能够存储的元素数量是有限的。
  • 循环利用空间:当队尾指针到达数组的末尾时,下一个元素会循环到数组的开头位置。
  • 高效操作:循环队列可以避免在数组末尾重新分配空间,从而提高入队和出队操作的效率。

基本操作

  1. 入队(Enqueue):在队尾添加一个元素。如果添加后队尾指针到达数组末尾,则循环回数组的开始位置。
  2. 出队(Dequeue):移除队首的元素。如果移除后队首指针到达数组末尾,则循环回数组的开始位置。
  3. 查看队首元素(Peek/Front):返回队首元素的值,但不移除它。
  4. 检查是否为空(IsEmpty):如果队首和队尾指针相同,且队列未满,则队列为空。
  5. 检查是否已满(IsFull):如果队尾指针在移动一位后将与队首指针相遇,或者队列的元素数量等于数组的大小,则队列为满。

适用场景

  • 当数据元素数量相对固定时,循环队列可以高效地利用内存空间。
  • 在需要频繁入队和出队操作的场景中,循环队列可以减少内存分配和回收的开销。

循环队列的实现

定义

循环队列的实现需要一个定长数组arr,一个头指针head,一个尾指针rear,还有用于记录数据个数的变量k。

​
typedef struct 
{int* arr;int head;int rear;int k;} MyCircularQueue;​

各个接口的实现

创造k个数据的循环队列

​
​
​
MyCircularQueue* myCircularQueueCreate(int k) 
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->arr = (int*)malloc(sizeof(int)*(k+1));obj->head = obj->rear = 0;obj->k = k;return obj;
}​​

这里为什么数据个数是k个,但开了k+1个空间?

首先,head指向队列的第一个元素,rear指向队列最后一个元素的下一个位置。

当rear == head的时候,队列可能是空,也可能是满;当队列满的时候,rear指向的应该是最后一个元素的下一个位置,也就是head(循环队列);当队列为空时,rear == head(rear和head可能不等于0)

所以判断队列为空和队列为满的条件是冲突的,所以特意开多一个空间,这样的话这个循环数组的任意时刻都有一个位置不存放元素,这两个判断条件也就不冲突了。

销毁循环队列

释放动态开辟的数组,把head、rear、k值0即可。

void myCircularQueueFree(MyCircularQueue* obj) 
{free(obj->arr);obj->head = obj->rear = obj->k = 0;
}

判断循环队列是否为空

判断rear和head是否相等就可以。

​
bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{return obj->head == obj->rear;
}​

判断循环队列是否为满

其实在创建数组的时候多开的那个空间就是专门为了rear准备的,这里队列为满时rear就不会和head指向同一位置,而是指向多开出来的那个空间。

理想情况下,rear + 1 == head就说明队列为满。

而如果rear刚好是数组的最后下标,rear+1就会越界,所以需要模上capacity(k + 1)。

bool myCircularQueueIsFull(MyCircularQueue* obj) 
{return (obj->rear + 1) % (obj->k + 1) == obj->head;
}

插入元素到队尾(入队列)

如果插入成功,返回true。

注意先判断队列是否为满,如果满,返回false。

还需注意rear是否会越界的问题

​
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{if(myCircularQueueIsFull(obj)){return false;}obj->arr[obj->tail++] = value;//记得让rear模上一个周期(k+1),以防越界obj->rear %= (obj->k + 1);return true;
}​

删除队头元素(出队列)

删除成功就返回true。

注意判断队列为空和head的越界问题即可。

bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return false;}obj->head++;//防止head越界obj->head %= (obj->k + 1);return true;
}

获取队头元素

注意队列为空,为空就返回-1。

int myCircularQueueFront(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->arr[obj->head];
}

获取队尾元素

还是注意如果队列为空,为空就返回-1。

​
int myCircularQueueRear(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->arr[(obj->rear + obj->k) % (obj->k + 1)];
}​

这里不能直接return obj->arr[rear - 1],因为rear有可能是0,还是得对rear进行特殊处理。

(rear + k + 1 - 1)% (k + 1)就可以处理上面这种特殊情况。


拜拜,下期再见😏

摸鱼ing😴✨🎞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot的配置文件

目录 一、配置文件 1.properties为后缀的配置文件 1.1基本语法 1.2读取配置文件 1.3properties的优缺点 1.4加中文注释出现乱码 2.yml格式的配置文件 2.1基础语法 2.2读取配置文件 2.2.1对象存储到配置文件中 2.3yml的优缺点 2.4用不用加单引号或者双引号呢&#xf…

【C语言篇】编译和链接以及预处理介绍(上篇)

文章目录 前言翻译环境和运行环境翻译环境编译预处理(预编译)编译词法分析语法分析语义分析 汇编 链接 运行环境预处理(预编译)详解预定义符号#define定义常量#define定义宏带有副作用的宏参数宏替换的规则宏和函数的对比 写在最后…

opencv基础的图像操作

1.读取图像,显示图像,保存图像 #图像读取、显示与保存 import numpy as np import cv2 imgcv2.imread(./src/1.jpg) #读取 cv2.imshow("img",img) #显示 cv2.imwrite("./src/2.jpg",img) #保存 cv2.waitKey(0) #让程序进入主循环(让…

RAG系列之四:深入浅出 Embedding

在 RAG 系列之三:文本切分中介绍了如何将文本切分成更小的语义单元,接下来便是将拆分的文本块进行向量化。 什么是文本向量化? 文本向量化就是将文本数据转成数字数据,例如:将文本 It was the best of times, it was…

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论,读者对于context在心中有了一定的理解。但始终觉得少点什么:activity是什么时候被创建的&…

Python数据可视化案例——地图

目录 简单案例: 进阶案例: 继上文数据可视化案例,今天学习用pyecharts练习数据可视化案例2-构建地图。 简单案例: 首先构建一个简单的地图。 代码: import json from pyecharts.charts import MapmapMap() data[…

培训学校课程管理系统-计算机毕设Java|springboot实战项目

🍊作者:计算机毕设残哥 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目、 源…

大数据面试SQL(八):求连续段的起始位置和结束位置

文章目录 求连续段的起始位置和结束位置 一、题目 二、分析 三、SQL实战 四、样例数据参考 求连续段的起始位置和结束位置 一、题目 有一张表t2_id记录了id,id不重复,但是会存在间断,求出连续段的起始位置和结束位置。 样例数据&…

结构体structure、共用体union

目录 结构体 结构体类型的定义形式 结构体类型的大小 内存计算例子 共用体union 用共用体判断大小端 结构体和共用体对比 qsort() 结构体 结构体类型——用来描述复杂数据的一种数据类型 构造类型(用户自定义类型) struc…

CUDA+tensorflow+python+vscode在GPU下环境安装及问题汇总与解答

2024.8.14 因为要做深度学习,需要安装tensorflowgpu的环境,每次都搞不好整的很生气,本次将安装过程中参考的一些大佬的博客和安装过程中遇到的问题及解决方案总结一下,希望以后不要在这件事情上浪费时间。安装环境其实也没有想象中…

Halcon图像平滑与去噪

Halcon图像平滑与去噪 文章目录 Halcon图像平滑与去噪1. 均值滤波2. 中值滤波3. 高斯滤波5. 光照不均匀 有时拍摄的图像中会存在很多杂点和噪声,对于比较均匀的噪声,可以考虑用软件的算法进行 消除。例如,可以用图像平滑的方法进行去噪&#…

uniapp 自定义全局弹窗

自定义全局弹窗可在js和.vue文件中调用&#xff0c;unipop样式不满足&#xff0c;需自定义样式。 效果图 目录结构 index.vue <template><view class"uni-popup" v-if"isShow"><view class"uni-popup__mask uni-center ani uni-cust…

数学建模——启发式算法(蚁群算法)

算法原理 蚁群算法来自于蚂蚁寻找食物过程中发现路径的行为。蚂蚁并没有视觉却可以寻找到食物&#xff0c;这得益于蚂蚁分泌的信息素&#xff0c;蚂蚁之间相互独立&#xff0c;彼此之间通过信息素进行交流&#xff0c; 从而实现群体行为。 蚁群算法的基本原理就是蚂蚁觅食的过程…

R语言的算数运算

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 3章3节&#xff1a;R的赋值操作与算术运算_r 链式赋值-CSDN博客文章浏览阅读172次。掌…

Ajax-02.Axios

Axios入门 1.引入Axios的js文件 <script src"js/axios-0.18.0.js"></script> Axios 请求方式别名: axios.get(url[,config]) axios.delete(url[,config]) axios.post(url[,data[,config]]) axios.put(url[,data[,config]]) 发送GET/POST请求 axios.get…

Windows的cmd命令行使用Linux类命令

Windows的cmd使用Linux类命令 去我的个人博客观看&#xff0c;观感更佳哦&#xff0c;&#x1f619;&#x1f619; 前言 我在使用Vscode编写C/C代码的时候&#xff0c;经常会用到Shell(你可以理解为命令行)&#xff0c;但是我不得不说Windows下Dos命令极其难用且拉跨&#x1f…

灵活易用的树莓派相机和计算机,降低了3D冰川建模的成本!

利兹大学的研究人员正在监测秘鲁的凯尔卡亚冰帽&#xff0c;这是世界上仅有的几个热带冰帽之一。 在欧洲成功进行试验之后&#xff0c;利兹大学地理学院​​​​​​​的研究人员正在安第斯山脉和喜马拉雅山脉使用树莓派计算机和树莓派高品质相机&#xff0c;建立低成本、长期…

C# simd指令之MaskMove

MaskMove指令说明&#xff1a;该方法将掩码向量中的每个非零元素对应的源向量中的元素移动到内存地址指定的位置。如果掩码中的元素为零&#xff0c;则对应的内存位置不会被修改。 MaskMove指令接受三个参数&#xff08;source、mask、address&#xff09;&#xff1a; 源向量…

养生生活视频素材去哪里找?养生系列视频素材网站分享

如何寻找高质量的养生视频素材。无论您是刚入行的新手&#xff0c;还是拥有众多粉丝的资深创作者&#xff0c;优质的养生视频素材都是吸引观众的关键。接下来&#xff0c;我将介绍一些顶级平台&#xff0c;帮助您轻松获取各类养生视频素材。 蛙学网 首先推荐的平台是蛙学网。这…

鸿蒙开发APP应用UX体验标准

基础体验 应用导航 3.1.1.1 系统返回 页面布局 3.1.2.1 布局基础要求 3.1.2.2 挖孔区适配 人机交互 3.1.3.1 避免与系统手势冲突3.1.3.2 典型手势时长设计3.1.3.3 点击热区 视觉风格 3.1.4.1 色彩对比度3.1.4.2 字体大小 3.1.4.3 图标 3.1.4.3.1 应用图标3.1.4.3.2 界…