循环队列的结构设计和基本操作的实现(初始化,入队,出队,判空,获取长度,清空,销毁)

目录

1.队列的定义

2.循环队列的设计图示

3.循环队列的结构设计

4.循环队列的实现

5.循环队列的总结


1.队列的定义

和栈相反,队列(queue)是一种先进先出(first in  first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素.

在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front).


2.循环队列的设计图示

image-20230615214707595.png


3.循环队列的结构设计

typedef  struct  SqQueue
{int *base;//指向动态内存;int front;//队头指针,队头元素的下标int rear;//队尾指针,当前可以插入数据的下标(队尾后一个元素的下标)//int queuesize;//队列的总容量,要做到自动扩容就必须增加这个成员;
}SqQueue,*PSqQueue;


4.循环队列的实现

//初始化
void  InitQueue(PSqQueue pq)
{assert(pq != NULL);if (pq == NULL)return;pq->base = (int*)malloc(sizeof(int) * SIZE);assert(pq->base != NULL);pq->front = 0;pq->rear = 0;
}static  bool IsFull(PSqQueue pq)
{return  (pq->rear + 1) % SIZE == pq->front;//return pq->rear + 1 == pq->front;//error,需要处理成环形;
}//往队列中入数据(入队操作)
bool  Push(PSqQueue pq, int val)
{assert(pq != NULL);if (pq == NULL)return false;if (IsFull(pq))//如果队满则入队失败{return false;}pq->base[pq->rear] = val;//pq->rear++;//error,必须要处理成环形;pq->rear = (pq->rear + 1) % SIZE;return true;
}
//获取队头元素的值,但是不删除
bool  GetTop(PSqQueue pq, int* rtval)
{assert(pq != NULL);if (pq == NULL)return false;if (IsEmpty(pq)){return false;}*rtval = pq->base[pq->front];return true;
}
//获取队头元素的值,但是删除
bool   Pop(PSqQueue pq, int* rtval)
{assert(pq != NULL);if (pq == NULL)return false;if (IsEmpty(pq)){return false;}*rtval = pq->base[pq->front];//pq->front++;//errorpq->front = (pq->front + 1) % SIZE;return true;
}
//判空
bool IsEmpty(PSqQueue pq)
{assert(pq != NULL);if (pq == NULL)return false;return  pq->front == pq->rear;
}
//获取队列中有效元素的个数
//重点,考点:公式
int  GetLength(PSqQueue pq)
{assert(pq != NULL);if (pq == NULL)return -1;return (pq->rear - pq->front + SIZE) % SIZE;
}
//清空所有的数据
void Clear(PSqQueue pq)
{pq->front = 0;pq->rear = 0;
}
//销毁
void Destroy(PSqQueue pq)
{assert(pq != NULL);if (pq == NULL)return;free(pq->base);pq->base = NULL;pq->front = 0;pq->rear = 0;
}


5.循环队列的总结


1.队列:先进先出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头

2.队列的存储方式有两种,一种为顺序结构(顺序队列),两一种为链式结构(链式队列)

3.顺序队列一定会设计成环形队列,原因是线性队列的入队为O(1),出队为O(n),而环形队列的入队为O(1),出队为O(1)

4.浪费一个空间不使用,主要是为了区分队空和队满的情况:空是队头和队尾相同,满是rear(队尾指针)再往后走一步为front(队头指针) (浪费一个空间)

5.队满的处理方式:1.固定长度,队满则入队失败(处理简单,不实用),采用1,和书本一致.2,长度不固定,队满则自动扩容(实现稍微复杂)

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

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

相关文章

根文件系统构建-busybox中文支持

一. 简介 根文件系统里面就是一堆的可执行文件和其他文件组成的?难道我们得一个一个的从网上去下载这些文件?显然这是不现实的!那么有没有人或者组织专门干这个事呢? 他们负责“收集”这些文件,然后将其打包&#xf…

阿里云域名解析到非默认端口处理方式

1.需配置两条解析记录,如下图 2.第一条配置A记录,ip指向部署服务器 3.第二条配置隐形记录,指向第一条的网址,并附带端口号,最终访问第二条的网址就不用带非默认端口号了。 4.最终浏览器访问

[FC][常见Mapper IRQ研究]

本次IRQ研究了如下表所示Mapper的IRQ操作: 卡带名Mapper号VRC373VRC421,23,25VRC624 & 26VRC785MMC34MMC410MMC55Sunsoft FME-769Namco16319Jaleco SS 8800618RAMBO-164 共计11种Mapper的IRQ操作使用例子 代码内有详细注释, 希望能帮助到感兴趣的人. Mapper控制代码(MMC3…

matplotlib学习

显示两个figure 坐标上刻度修改 plt.xlim() 下标范围 plt.xticks() 替换新的下标 图例显示 散点图 subplot多合一显示

docker部署frp穿透内网

文章目录 (1)部署frps服务器(2)部署frpc客户端(3)重启与访问frp(4)配置nginx反向代理 (1)部署frps服务器 docker安装参考文档:docker基本知识 1…

Tmux奇技淫巧

Tmux奇技淫巧 在日常的开发工作中,终端是我们最常用的工具之一。在终端中我们可以调用各种解释器,来执行命令,完成我们的工作。然而,对于只使用终端的默认功能的开发者来说,他们可能会错过一些强大的工具和技巧&#…

【SLAM十四讲-9.3 实践Ceres BA-BAL数据集problem-16-22106-pre.txt分析】

数据集Dubrovnik Dataset 杜布罗夫尼克数据集的链接:Bundle Adjustment in the Large https://grail.cs.washington.edu/projects/bal/ problem-16-22106-pre.txt.bz216 22106 83718(这里是第1行) 0 0 -3.859900e02 3.871200e02&#x…

Gson的用法详解

一、简介 Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。 Gson官网:gson Gson源码地址:google/gson 二、依赖…

STM32F407-14.3.8-01强制输出模式

强制输出模式 在输出模式(TIMx_CCMRx 寄存器中的 CCxS② 位 00)下,可直接由软件将每个输出比较信号(OCxREF④ 和 OCx⑥/OCxN⑦)强制设置为有效电平或无效电平,而无需考虑输出比较寄存器和计数器之间的任何…

CMake构建工具

文章目录 CMake构建工具1.概念2.mk文件3.CmakeList4.预编译 CMake构建工具 1.概念 Android构建原始库的工具,对mk构建工具封装,还是makefile。 加载lib库 2.mk文件 //call调用test-dir这个方法,返回mk文件的路径,LOCAL_PATH这…

一文搞懂设计模式之责任链模式

大家好,我是晴天。我们又见面了,本周我们继续学习设计模式,本周将同大家一起学习责任链模式。 场景引入 我们回想一下自己曾经经历过的考学场景,我们是如何一步一步考上大学的(为了简化过程只提取核心环节&#xff09…

如何使用vue组件

目录 1:组件之间的父子关系 2:使用组件的三个步骤 3:components组件的是私有子组件 4:在main.js文件中使用Vue.component全局注册组件 1:组件之间的父子关系 一:首先封装好的组件是不存在任何的关系的…

强化学习简明教程

到目前为止,我们主要关注监督学习问题(主要是分类)。 在监督学习中,我们得到某种由输入/输出对组成的训练数据,目标是能够在学习模型后根据一些新输入来预测输出。 例如,我们之前研究过 MNIST 的卷积神经网…

阅读笔记|A Survey of Large Language Models

阅读笔记 模型选择:是否一定要选择参数量巨大的模型?如果需要更好的泛化能力,用于处理非单一的任务,例如对话,则可用选更大的模型;而对于单一明确的任务,则不一定越大越好,参数小一…

BearPi Std 板从入门到放弃 - 1 引气入体篇

安装相关开发工具 Keil MDK 工具下载 略, 自行体会 Keil 芯片支持包下载 Keil 包 网址 https://www.keil.com/pack 此处下载的是STM32L4xx的支持包 https://www.keil.com/pack/Keil.STM32L4xx_DFP.2.6.2.pack STM32CubeMX 下载与包下载 i. 下载(需要使用用户&…

DouyinAPI接口系列丨Douyin商品详情数据接口丨Douyin视频详情数据接口

抖音商品详情API是抖音开放平台提供的一套API接口,用于获取商品详情信息。通过该API,开发者可以获取到商品的详细信息,包括商品ID、名称、描述、价格、销量、评价等信息。 在使用抖音商品详情API之前,需要先注册并登录抖音开放平…

fl studio21.2最新汉化中文完整版网盘下载

fl studio 21中文版是Image-Line公司继20版本之后更新的水果音乐制作软件,很多用户不太理解,为什么新版本不叫fl studio 21或fl studio2024,非得直接跳到21.2版本,其实该版本是为了纪念该公司22周年,所以该版本也是推出…

系统监控:使用日志文件 journalctl的使用

journalctl 显示最近登录的: 上面有最近登录的时间,和系统操作 几十年来,Linux日志记录一直由syslogd守护进程管理。Syslogd将收集系统处理和应用程序发送到/dev/log伪设备的日志消息。然后,它会将消息定向到/var/log/目录中适当…

MacDroid Pro for Mac – 安卓设备文件传输助手,实现无缝连接与传输!

想要在Mac电脑上轻松管理和传输您的安卓设备文件吗?MacDroid Pro for Mac 是您的最佳选择!这款强大的文件传输助手可以让您在Mac上与安卓设备之间实现快速、方便的文件传输。 MacDroid Pro for Mac 提供了简单易用的界面,让您能够直接在Mac上…

人工智能和网络安全:坏与好

人工智能似乎可以并且已经被用来帮助网络犯罪和网络攻击的各个方面。 人工智能可以用来令人信服地模仿真人的声音。人工智能工具可以帮助诈骗者制作更好、语法正确的网络钓鱼消息(而糟糕的语法往往会暴露出漏洞),并将其翻译成多种语言&…