顺序循环队列的实现

顺序循环队列的基本概念

1、队列

        定义:队列是一种线性数据结构,它遵循先进先出的原则。就像排队买东西一样,先到的人先接受服务。在队列中,元素从队尾进入队列,从队头离开队列。

2、缺点

        上面描述的队列有如下缺点:

        (1)空间利用率低

        当队列执行出队操作后,前面的空间就空出来了,空间难以再被利用。以数组实现普通队列为例,假设有一个大小为5的数组arr,依次入队元素1、2、3。出队元素1后,数组的零号下标位置就会空出,如果再进行入队操作,只能在3号下标位置入队,不能利用前面空出的位置。

        (2)容易出现假溢出的情况

        以数组实现普通队列为例,队列在进行入队操作时,当队尾指针到达数组末尾,即使数组前面还有空闲空间,也会认为队列已满,出现假溢出的情况。

3、循环队列

        循环队列通过循环存储的方式解决了上述缺点,只要队列整体未满,就可以继续进行入队操作。还是以数组实现循环队列为例,当有元素入队时,队尾指针加一,当存储到数组末尾位置时候,队尾指针的下一个位置是数组的零号下标。当有元素出队时,队头指针加一,当队头指针移动到数组末尾位置时,队头指针的下一个位置同样也是数组的零号下标。这样进行存取数据时,可以避免浪费前面空出位置的情况。

4、如何解决顺序循环队列的判空和判满问题

        在利用数组实现循环队列的过程中,可以发现队列为空和队列为满时,队列的队头指针和队尾指针都会相等,那么就很难判断相等时究竟队列为空还是队列为满。

        为了解决这一问题,这里提出两种解决方法:

        (1)额外增加一个变量来记录队列中元素的个数,当元素个数等于队列的最大容量时,队列为满,元素个数为零时,队列为空。

        (2)牺牲一个存储单元来区分队满和队空。判满条件是(rear+1)%MAX == front,其中MAX是队列的最大容量。判空条件是rear == front,即头尾指针相等。

顺序循环队列的代码实现

准备工作

在用代码来实现顺序循环队列时,作如下约定:

约定一:数组的大小为LEN时,最多只存LEN-1个元素(为了方便判空和判满)

约定二:数组的LEN-1号下标的下一个位置为0号下标位置(实现循环存储)

在定义头尾指针时,有如下规定:

规定一:头指针front指向队头元素的前一个位置,尾指针rear指向队尾元素所在位置。

规定二:头指针front指向队头元素的位置,尾指针rear指向队尾元素的下一个位置。

        这两个约定在代码实现中都要遵守,两个规定在代码实现中,选择其中一个遵守,下面的代码实现中,选择规定二。

定义结构体 

typedef char Type; //方便后续修改维护
#define LEN 10 //最多存储LEN-1个元素typedef struct{Type data[LEN]; //队列的存储空间int front; //队头指针:队头的下标int rear;  //队尾指针:队尾的下标+1
}queue;        //顺序循环队列

功能函数部分 

创建:

        为队列结构体动态申请空间并检查是否申请成功,初始情况下,队头在零号位置,队尾在负一号位置,则头尾指针都为零。最后返回结构体指针。

queue *create_queue()
{queue *q = (queue *)malloc(sizeof(queue));if(NULL == q){perror("malloc queue error");return NULL;}q->front = 0;q->rear = 0;return q;
}

判空: 

        当两个指针相等时,队列为空。这里并不是两个指针相等且都为零,因为当进行出队操作后,头指针会向后移动,所以队列为空时,二者可能在中间位置相等。队列为空函数返回0,队列非空函数返回1,出错情况下返回-1。

int empty_queue(queue *q)
{if(NULL == q){puts("queue is NULL");return -1;}if(q->front == q->rear){puts("queue is empty");return 0;}elsereturn 1;
}

判满: 

        当队列为满的时,满足(rear+1)%LEN = front,加取余的原因是,当队尾在len-2号下标且队列为满时,队头在0号下标,rear = 队尾+1 = len – 1,此时rear + 1 = len,取余才能与front相等。

int full_queue(queue *q)
{if(NULL == q){puts("queue is NULL");return -1;}if((q->rear+1)%LEN == q->front){puts("queue is full");return 0;}elsereturn 1;
}

入队:

        当队列未满才能进行入队操作,尾指针当前指向队尾的下一个位置,在尾指针位置插入,然后将尾指针后移,因为后移操作可能会移动到LEN-1号下标位置,所以要进行取余操作。

void enter_queue(queue *q,Type data)
{if(full_queue(q) == 1){q->data[q->rear] = data;q->rear = (q->rear+1)%LEN;}
}

出队:

        当队列非空时才能进行出队操作,头指针当前指向的就是队头数据,保存该数据的值,然后更新头指针指向下一个位置,同样的,后移操作可能会移动到LEN-1号下标,所以也要进行取余操作。最后返回保存的值。

Type delete_queue(queue *q)
{if(empty_queue(q) == 1){Type temp = q->data[q->front];q->front = (q->front+1)%LEN;return temp;}
}

初始化:

        头尾指针同时赋值为零,回到最初的创建状态。

void init_queue(queue *q)
{if(NULL == q){puts("queue is NULL");return;}q->rear = q->front = 0;
}

回收: 

        将结构体free掉,要注意的是,将主函数中的指针指向NULL,防止野指针的出现,所以此处应该传入二级指针。

void free_queue(queue **q)
{if(NULL == q){puts("queue is NULL");return;}free(*q);*q = NULL;
}

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

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

相关文章

初识网络原理

1.网络互联 网络互联就是将多台计算机连接在一起,完成数据共享。 数据共享本质就是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。 根据网络互联的规模不同,可以划分为局域网和广域网。 1.1 局域网 局域网&am…

文章管理系统微信小程序ssm+论文源码调试讲解

第2章 关键技术简介 2.1 微信小程序 微信小程序,简称小程序,英文名Mini Program,是一种全新的连接用户与服务的方式,可以快速访问、快速传播,并具有良好的使用体验[12]。 小程序的主要开发语言是JavaScript&#xff…

Python OpenCV孤立点检测

孤立点检测 在Python中使用OpenCV进行孤立点(异常点)检测,可以通过应用统计分析或者使用OpenCV的findContours和convexHull函数来识别。以下是一个简单的例子,使用OpenCV的findContours和convexHull来识别并绘制孤立点。 孤立点…

leetcode-15-三数之和

题解: 代码: 参考:leetcode-16-最接近的三数之和

PHP中小学优校管理系统小程序源码

🏫 中小学优校管理系统:打造教育新生态,赋能智慧校园 🏫 🏷️ 开篇:为什么我们需要中小学优校管理系统? 在教育日新月异的今天,传统的管理模式已难以满足现代学校的需求。面对庞大…

Java poi 模板导出Word 带图片

Java poi 模板导出Word 带图片 重点&#xff01;&#xff01;&#xff01; 官方文档&#xff1a;https://deepoove.com/poi-tl/#_maven 最终效果 模板 其实内容都在官方文档里写的非常明白了 我这里只是抛砖引玉。 Maven依赖 <poi.version>4.1.2</poi.version>…

【JAVA毕业设计】基于Vue和SpringBoot的微服务在线教育系统

博主说明&#xff1a;本文项目编号 T 060 &#xff0c;文末自助获取源码 \color{red}{T060&#xff0c;文末自助获取源码} T060&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

泷羽sec学习打卡-Linux基础

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于Linux的那些事儿-Base 一、Linux-Base什么时openssl&#xff1f;有哪些加密参数&#xff1f;常用lin…

【6.2】位运算-解重复的DNA序列

一、题目 所有 DNA 都 由 一 系 列 缩 写 为 A &#xff0c; C &#xff0c; G 和 T 的 核 苷 酸 组 成 &#xff0c; 例如&#xff1a;"ACGAAT TCCG"。在研究DNA时&#xff0c;识别DNA中的重复序列有时会对研究非常有 帮助。 编写一个函数来找出所有目标子串&#…

Net.Core Mvc 添加 log 日志

1: 首先在 Nuget 安装插件 2&#xff1a;添加 log 配置 在项目中新创件一个文件夹 ConfigFile 在文件家里面添加 log4net.config log4net.config 里面写入 <?xml version"1.0" encoding"utf-8"?> <configuration><log4net><!--跟…

A030-基于Spring boot的公司资产网站设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

AG32 MCU与CPLD通过AHB总线交互

MCU与CPLD可以通过AHB或APB总线进行数据交互。APB总线通常连接低速设备&#xff0c;如串口&#xff0c;而AHB总线则用于连接高速设备&#xff0c;如RAM等。由于我们需要高速采集大量数据&#xff0c;因此选择使用AHB总线与CPLD进行交互。 地址范围 在地址设计中&#xff0c;C…

【学习笔记】PT协程-未完待续

单线程编程-协程 单线程&#xff0c;所有协程都是共享栈–换句话说&#xff1a;裸机 代码结构 十分精简 lc 有两个版本 文件说明lc-addrlabels.h使用GCC扩展语法实现的协程基础lc-switch.h使用switch语句实现的协程基础lc.h用于选择GCC语法还是switch语句实现pt.h基于lc.h实…

【python系列】python内置函数print()和input()

1.前言 正式开始学习python编程基础知识&#xff0c;首先要建立正确的学习姿势&#xff0c;什么姿势呢&#xff0c;当然不是躺着。首先要学会看语法&#xff0c;学习每一个内置函数都要先把语法和语义理解&#xff0c;再结合勤于练习。有些同学可能英语不太好&#xff0c;这里…

并发基础:(淘宝笔试题)三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

字节、快手、Vidu“打野”升级,AI视频小步快跑

文&#xff5c;白 鸽 编&#xff5c;王一粟 继9月份版本更新之后&#xff0c;光锥智能从生数科技联合创始人兼CEO唐家渝朋友圈获悉&#xff0c;Vidu大模型将于本周再次进行版本升级&#xff0c;Vidu-1.5版本即将上线。 此版本更新方向仍是重点延伸大模型的泛化能力和主体…

redis实现消息队列的几种方式

一、了解 众所周知&#xff0c;redis是我们日常开发过程中使用最多的非关系型数据库&#xff0c;也是消息中间件。实际上除了常用的rabbitmq、rocketmq、kafka消息队列&#xff08;大家自己下去研究吧~模式都是通用的&#xff09;&#xff0c;我们也能使用redis实现消息队列。…

JVM(一、基础知识)

JVM虚拟机的灵魂三问 JVM是什么&#xff1f; 广义上是一种规范&#xff0c;狭义上的是JDK中的JVM虚拟机&#xff0c;虚拟机模拟计算机的组成部分&#xff0c;可以运行我们写的应用程序&#xff0c;是对操作系统的一层抽象&#xff0c;把我们的应用程序和操作系统解耦&#xff0…

问题分析与解决:Android开机卡动画问题分析

1. 问题背景及描述 在一个android设备的开发的项目中遇到了一个比较典型的问题:在主板贴片完成后,首次刷入androdi固件验证时,遇到了按键出发开机后,系统启动到android动画界阶段时一直循环卡在此阶段,无法进入桌面。如下如所示: 此问题在许多android项目的首次点亮阶段均…

视频会议接入GB28181视频指挥调度,语音对讲方案

传统的视频会议指挥调度系统目前主流的互联网会议大部分都是私有协议&#xff0c;功能都很独立。目前主流的视频监控国标都最GB平台&#xff0c;新的需求要求融合平台要接入监控等设备&#xff0c;并能实现观看监控接入会议&#xff0c;实时语音设备指挥现场工作人员办公实施。…