【数据结构】07.循环队列

news2024/11/27 14:47:17

一、循环队列的定义

定义:队列主要有顺序队列,循环队列,双端队列,优先队列。而当中循环队列是一种线性数据结构。它也被称为“环形缓冲器”。它只允许在一端进行插入操作,即队尾(rear),而在另一端进行删除操作,即队头 (front),其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。向队列中插入新的数据元素称为入队,新入队的元素就成为了队列的队尾元素。

特点:

  1. 循环队列允许元素在队尾插入,在队头删除,同时遵循先进先出原则。
  2. 由于循环队列是基于数组实现的,所以它的访问速度很快,特别是在移动元素时。
  3. 如果需要大量添加和删除元素,循环队列比链表更有效率,因为它不需要频繁地移动指针来访问元素。
  4. 不支持随机访问元素,因此不能像数组那样直接访问特定位置的元素。
    在这里插入图片描述

二、循环队列的实现

本篇文章要实现的操作如下:
在这里插入图片描述
本文的思路来自设计循环队列

2.1 循环队列的行为

我们使用顺序表来实现循环队列,在开始时初始化出队列的大小为k。并分别用front指向队头元素,rear指向队尾元素的下一个位置。

typedef struct 
{
    int* a;
    int front;
    int rear;
    int k;
} MyCircularQueue;

2.2 循环队列的初始化

我们在申请空间时多申请一个空间,用来解决假溢出问题。这样方便我们判断队列何时满了(rear的下一个位置是front就满了)

MyCircularQueue* myCircularQueueCreate(int k) 
{
    MyCircularQueue* q=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    q->a=(int*)malloc(sizeof(int)*(k+1));
    q->front=0;//头
    q->rear=0;//尾下一个
    q->k=k;
    return q;
}

2.3 循环队列的判空

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

2.4 循环队列的判满

可不要简单的以为循环队列满的条件就是rear + 1 == front,我们要考虑下面两种情况:
情况一:
在这里插入图片描述
情况二:
在这里插入图片描述
上面两种情况队列都是满的,显然我们不能简单的用front == rear + 1来判断队列是否已满。

直接下结论:我们可以用表达式(rear + 1) % (k + 1) == front来判断队列是否已满

bool myCircularQueueIsFull(MyCircularQueue* obj) 
{
    return (obj->rear+1)%(obj->k+1)==obj->front;//当rear指向多出来的位置时通过驱魔
}

2.4 循环队列的入队

在入队的时候我们也要考虑两种情况:
情况一:
在这里插入图片描述
情况二:
在这里插入图片描述

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{
    if(myCircularQueueIsFull(obj))
        return false;

    obj->a[obj->rear]=value;
    obj->rear++;
    obj->rear%=(obj->k+1);

    return true;
}

2.5 循环队列的出队

在出队时同样要考虑两种情况:
情况一:
在这里插入图片描述
情况二:
在这里插入图片描述

bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{
    if(myCircularQueueIsEmpty(obj))
        return false;
    
    obj->front++;
    (obj->front)%=(obj->k+1);
    return true;
}

2.6 返回队头元素

由于队头指针指向的就是队头元素,因此直接返回下标位置的元素即可

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

2.7 返回队尾元素

由于队尾指针指向的是队尾元素的下一个位置,因此要考虑两种情况:
情况一:

在这里插入图片描述
情况二:
在这里插入图片描述

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

2.8 循环队列的销毁

void myCircularQueueFree(MyCircularQueue* obj) 
{
    free(obj->a);
    free(obj);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【elasticsearch】IK分词器添加自定义词库,然后更新现有的索引

进入elasticsearch中的plugins位置,找到ik分词器插件,进入ik插件的config文件夹,当中有一个IKAnalyzer.cfg.xml配置文件。使用vim编辑器修改配置文件: vim IKAnalyzer.cfg.xml 配置文件如下(添加了自定义字典的位置&…

springboot交流论坛网站-计算机毕业设计源码00304

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了交流论坛网站的开发全过程。通过分析交流论坛网站管理的不足,创建了一个计算机管理交流论坛网站的方案。文章介绍了交流论坛网站的系统分析部分&…

名企面试必问30题(十九)——最近行业内你觉得做的最好的案例是哪一个,为什么?

1.思路 考察你对于行业了解,对于新动态是否保持时时关注,以及判断好和不好的能力。 首先,明确指出您认为行业内做得最好的案例。简要介绍该案例所属的公司和产品。阐述该案例在测试方面的突出特点和优势,例如采用了创新的测试方法…

海量设备集中运维,向日葵远程控制赋能农牧产品加工产业链

产业规模越大,单位成本就越低,这是一个广泛存在的商业规律。 在诸多行业中,农牧业的这种“规模效应”尤为明显,这使得在农牧行业内逐渐发展出许多横跨产业链上下游的大型企业集团,业务甚至覆盖相关产业设备的设计与生…

[产品]理解产品

课程安排 认识互联网行业 1.行业对比 2.互联网公司 广义理解: 互联网行业的公司大都以计算机网络技术为基础, 利用网络平台帮助企业提供服务, 并以此获取收入 3.行业细分 典型产品 认识产品经理 1.职责差异 不同类型的公司, 产品经理岗位所负责的工作都是略有差异的 1,外包…

555 定时器芯片工作原理

在本教程中,您将学习如何使用 555 定时器做一些有趣的事情。许多人用它做的第一件事就是制造闪烁的灯光。但这只是用该芯片可以做很多事情的简单示例之一。您还可以控制电机、创建闹钟、创建乐器等等。 让我们先来概览一下这些引脚。 555 定时器引脚排列 引脚 1 接地…

maven项目启动的时候,自动启动netty

1.写一个监听器,重开一个线程初始化,netty,一定要重开一个线程去启动,要不会阻塞的 public class StartupListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {// 在Web应用启动时启动WebSocket服务器new Thread(…

从零开始学量化~Ptrade使用教程(三)——行情界面主要功能

技术分析 除复权 提供向前复权、向后复权,系统默认不复权。此外,全面支持月、周、日线复权,支持向前和向后复权、不同时段分段复权等功能。系统能够根据盘中即时行情,个股K线图可以根据该股除权日的送股、配股及红利情况圆滑地画出…

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理

一、背景 随着城市化进程的加快,越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时,也伴随着一定的安全隐患。尤其是在一些危险水域,也经常出现垂钓者的身影,非法垂钓,这给城市管理带来了不小的阻力。传统的人…

狂赚三个亿,百亿医用耗材上市公司重金押注老人轮椅

布局海外市场,轮椅销量翻两番 作者 | 艾米莉 排版 | 张思琪 抛砖引玉 1.年销售60万台轮椅,英科医疗如何做到? 2.老年人轮椅是出海,还是深耕国内市场? 3.2022年全球轮椅市场规模为48亿美元,谁在喝汤&…

NLTK下载及其报错问题,包解决

目录 问题分析 下载 报错 报错原因 正确ip获取 写入host文件 再次下载 测试是否成功 问题分析 NLTK一般是在作自然语言处理时用到,最开始时,我是直接在conda进行conda install nltk进行安装,以为就可以直接使用,但是运行…

基于docker环境及Harbor部署{很简短一点了,耐心看吧}

用到的环境: docker 、nacos、compose、harbor(自行安装 ,以下连接作为参考) nacos:史上最全整合nacos单机模式整合哈哈哈哈哈_nacos 源码启动 单机模式-CSDN博客 docker、compose、harbor:史上最全的整合Harbor安装教程&#…

Java 并发集合:CopyOnWrite 写时复制集合介绍

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 016 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

openssl交叉编译-移植ARM

OpenSSL是一个开源的密码学工具包,提供了一组用于网络安全的加密和解密算法、协议以及相关工具的库,它通过提供多种加密算法、协议和工具,为网络通信和数据存储提供了强大的安全保障。 主要功能 加密和解密: OpenSSL提供了多种对…

数据异常不用怕,GaiaDB有办法

百度智能云云数据库,开启了特惠专场!热销规格新用户免费使用,欢迎参与! 背景 在大多数业务场景中,数据库主要负责提供对当前数据的查询能力。然而,对于一些特定业务场景,如游戏运营和金融交易…

[层次分析法+模糊综合分析] 基于matlab的XX公司发展情况的综合评价

一 背景介绍 本文分析了一个使用层次分析法(AHP)和模糊综合评价对XX公司的发展现状进行评价,得到了整体的评价结果。主要包含: 专家打分-一致性分析-权重计算-问卷调查-评价矩阵-隶属度矩阵-最终评价结果等内容 二 评价体系的建立 根据XX公司…

亿发:信息化建设or面子工程?究竟什么才是真正的信息化解决方案

在现代企业的竞争中,信息化建设扮演着越来越重要的角色。信息化技术不仅是企业提升管理效率、优化运营模式的利器,更是企业在市场竞争中脱颖而出的关键。然而,许多企业在推进信息化的过程中,往往容易陷入“面子工程”的误区。那么…

mysql8 导入导出工具类,支持windows 和linux

概述 1)导入导出工具类 支持windows 和linux,详见第3部分 2)导入、导出参数在 dbeaver 中应用,详见第4部分 整理原因: 1)中文乱码 --default-character-setutf8 2)BLOB 导出后,导入失败 --he…

利用git将Qt代码托管到U盘或者网盘

文章目录 1.前言2.解决方案3.操作步骤3.1.软件安装3.2.在U盘创建裸仓库3.3.创建Qt程序并将代码上传至U盘3.4.版本标记及切换3.4.在别的电脑上clone代码出来 4.其他5.结语 1.前言 我们在开发项目时,随着项目需求的增加以及bug的修复,肯定会涉及到版本管理…

2024年中国安防CIS市场现状及主要竞争企业分析

2024年中国安防CIS市场现状及主要竞争企业分析 CIS又名CMOS图像传感器,属于一种光学传感器,将光信号转换为电信号并通过读出电路转为数字化信号,是摄像头模组的核心元器件,可以用于手机、汽车、电脑、安防、消费等领域。不同应用领…