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

一、循环队列的定义

定义:队列主要有顺序队列,循环队列,双端队列,优先队列。而当中循环队列是一种线性数据结构。它也被称为“环形缓冲器”。它只允许在一端进行插入操作,即队尾(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.mzph.cn/news/866749.shtml

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

相关文章

【对顶堆 优先队列】295. 数据流的中位数

本文涉及知识点 对顶堆 优先队列 LeetCode295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 …

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)

声明 本文所使用的一些源代码等内容已经上传至github,具体地址如下 Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main a2148001284/Vulnerability_POC-EXP GitHub 漏洞简介 参考内容: CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 |…

有哪些有效的策略可以提升独立站的外链数量?

有哪些有效的策略可以提升独立站的外链数量?提升独立站的外链数量并不难,难得是不被谷歌惩罚把你的网站判定为作弊,正因如此,了解并应用GNB自然外链策略是个不错的开始,GNB外链的核心价值在于它提高了网站外链资源的自…

Hazelcast同一个集群发布注意数据一致性与版本兼容性检查示例

Hazelcast Hazelcast是一个开源的、分布式内存数据网格(IMDG,In-Memory Data Grid)平台,它提供了一系列的分布式数据管理和计算服务。Hazelcast旨在解决大数据和高性能计算场景下的挑战,特别是在分布式系统中提供低延…

【LinuxC语言】线程池之添加工作任务线程

文章目录 前言工作线程工作流程代码介绍函数内容如何去编写代码概况总结前言 在并发编程中,线程池是一种常见的设计模式,它可以有效地管理和控制线程的执行。线程池中的线程可以执行一系列的任务,这些任务通常是独立且相互没有依赖关系的。在Linux C语言环境下,我们可以使…

如何学习和提升SQL

资料来源于腾讯技术直播,只作为学习记录,如有侵权,请联系作者进行删除

Python正则表达式入门用法(下)

Python的正则表达式模块是re。要使用它,需要先导入re模块。下面是一些常用的正则表达式操作: re.match(pattern, string): 从字符串的开始位置匹配一个模式,并返回匹配对象。如果匹配成功,则返回匹配对象;如果匹配失败…

关于单点登录(Single Sign-On,SSO)

业务背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,用户用不同的账号即可登录,很方便。 但随着企业的发展,用到的系统随之增多,用户在操作不同的系统时…

分享6个自己每天都会打开的网站

分享6个自己每天都会打开的网站,有实用办公网站,也有休闲摸鱼网站,链接直达,速看~ 1、鸠摩搜索 https://www2.jiumodiary.com/ 一个免费的电子书下载网站,页面干净无广告,只有一个搜索框,输入…

应用了网络变压器的PC网卡连接转换器后不好连网,有掉线现象,但外接路由器无问题,可能是什么原因?

Hqst盈盛(华强盛)电子导读:今天分享的是应用了网络变压器的PC网卡连接转换器后不好连网,有掉线现象,但外接路由器无问题,可能是什么原因呢?如何解决呢? 首先,我们要了解传…

web前端之浏览器从输入URL到页面展示的过程、建立TCP连接与三次握手、发送HTTP请求、DNS解析、地址、渲染

MENU 前言DNS解析建立TCP连接发送HTTP请求服务器处理请求接收HTTP响应解析HTML解析CSS渲染页面结束 前言 浏览器从输入URL到页面展示的过程,这是一件看似简单却又十分复杂的事情。我们每天都在使用浏览器,却很少关注它们背后的工作原理。本文将从多个方面…

Kotlin/Android中执行网络请求

方式一:使用okhttp3 okhttp官网 okhttp3 github地址 打开build.gradle.kts文件加入依赖 dependencies {implementation("com.squareup.okhttp3:okhttp:4.9.0") }在IDEA的Gradle面板点击reload按钮便会自动下载jar 使用网络请求时需要把网络的权限打开&a…

java必知必会-jsp

文章目录 一、什么是JSP?二、jsp运行原理三、文档结构四、jsp基本语法五、jsp9大内置对象(笔试)六、el(${el表达式}):Expression Language七、11个内置对象(自定义的数据必须放在域中el才能得到)八、jstl(jsp Standard Tag Library)总结 一、…

12.【C语言】创建函数

1.先创建函数(一劳永逸) Add函数VS2022中不是自带的,需要创建 int Add(int x, int y) {int z 0;z x y;return z; } 2.函数的调用:函数名(x,y) int sum Add(num1, num2); 完整代码 #de…

Nuxt3 的生命周期和钩子函数(十一)

title: Nuxt3 的生命周期和钩子函数(十一) date: 2024/7/5 updated: 2024/7/5 author: cmdragon excerpt: 摘要:本文详细介绍了Nuxt3中几个关键的生命周期钩子和它们的使用方法,包括webpack:done用于Webpack编译完成后执行操作…

pytorch-时间序列

目录 1. 时间序列2. word embedding2.1 one hot2.2 word2vec2.3 GloVe 1. 时间序列 具有时间相关性的序列叫做时间序列,比如:语音、文本句子 2. word embedding 2.1 one hot 针对句子来说,可以用[seq_len, vector_len] 有多少个单词vecto…

2024第二届电子通信与计算机科学技术国际会议(ICECCST 2024)

2024第二届电子通信与计算机科学技术国际会议(ICECCST 2024) 会议简介 2024第二届电子通信与计算机科学技术国际会议(ICECCST 2024)是一次重要的学术盛会,将在中国厦门举行。会议的主要目的是为全球的电子通信和计算机科学技术领域的专家、…

数字信号处理实验二(模拟信号采样与重构及频谱分析FFT)

模拟信号采样与重构及频谱分析FFT(2学时) 要求: 对一模拟信号进行采样;对该采样信号进行重构;分析它们的频谱特征。目的: 熟悉MATLAB命令和编辑、运行、调试环境;掌握采样定理及对信号的频谱分析…

将 build.gradle 配置从 Groovy 迁移到 Kotlin

目录 时间轴 常用术语 脚本文件命名 转换语法 为方法调用添加圆括号 为分配调用添加 转换字符串 重命名文件扩展名 将 def 替换为 val 或 var 为布尔值属性添加 is 前缀 转换列表和映射 配置 build 类型 从 buildscript 迁移到插件块 查找插件 ID 执行重构 转…

git 提交后发现有问题重改的正确方法

撤回上一次提交: git reset --soft HEAD^ 修改文件(如果需要)。 暂存修改后的文件: git add . 重新提交: git commit -m "新的提交信息" 强制推送到远程仓库:注意--force git push --force