C语言/数据结构——每日一题(设计循环队列)

一.前言

上一次我们分享了关于队列的基本实现——https://blog.csdn.net/yiqingaa/article/details/139033067?spm=1001.2014.3001.5502

现在我们将使用队列知识来解决问题——设计循环队列:https://leetcode.cn/problems/design-circular-queue/submissions/533299335

二.正文

1.1题目描述

1.2题目分析

本题给了我们七个操作需求,需要我们将这些函数功能实现出来。

对于这道题,假如我们是使用数组来实现队列,在这里我们可以事先模拟走一下:

那么我们如何解决这个问题呢。在这里我们我们可以通过多创建一个空间的方式解决这个问题。

(1)定义栈的结构

typedef struct {int* a;//a是int*类型的数组int k;//k代表了我们的数组长度int head;//head会指向我们的头元素(head在这里不是指针,可以当成另类的下标)int tail;//tail在我们数据的后一个位置(tail在这里不是指针,可以当成另类的下标)
} MyCircularQueue;

假如k是4,数组有1,2,3,4这些数据。那么就有:

 (2)创建我们的队列

MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a=(int*)malloc(sizeof(int)*(k+1));if(obj->a==NULL){perror("malloc fail!");}obj->k=k;obj->head=obj->tail=0;return obj;
}

我们首先为我们的队列结构体申请了sizeof(MyCircularQueue)字节大小的空间。

然后又为了我们数组申请了sizeof(int)*(k+1)字节大小的空间。

用我们的结构体成员k接受形参k的值。

并让head,tail都初始化为0。

(3)判断队列是否为空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->head==obj->tail)return true;return false;
}

这里我们先实现了判断队列是否为空的函数功能,因为这个函数功能在后面实现数据插入和删除中都需要用到,因此,在这里我们就先实现了。

 (4)判断队列是否数据已满

bool myCircularQueueIsFull(MyCircularQueue* obj) {if((obj->tail+1)%(obj->k+1)==obj->head)return true;return false;
}

 (5)队列数据的插入

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)==true)return false;
obj->a[obj->tail]=value;
obj->tail++;
obj->tail=(obj->tail)%(obj->k+1);
return true;
}

这里我们先进行了判断,如果队列数据已经满了,就插不了数据了,直接返回false即可。

在这里,我们需要额外注意这行代码:obj->tail=(obj->tail)%(obj->k+1);

相信同学们看到这里已经发现了,我们上述代码中很多都用到了取余%的应用,这是为了让head和tail能正常的循环。

(6) 队列数据的删除

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

这里我们需要知道,如果队列没有数据的时候,我们不能进行数据删除,因为本来队列都没数据了,再删除就会出现内存泄露的问题。

(7) 取出队头的数据

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

 (8)取出队尾的数据

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

 (9)销毁我们创建的对列

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

 1.3代码实现

typedef struct {int* a;int k;int head;int tail;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a=(int*)malloc(sizeof(int)*(k+1));if(obj->a==NULL){perror("malloc fail!");}obj->k=k;obj->head=obj->tail=0;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->head==obj->tail)return true;return false;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {if((obj->tail+1)%(obj->k+1)==obj->head)return true;return false;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)==true)return false;
obj->a[obj->tail]=value;
obj->tail++;
obj->tail=(obj->tail)%(obj->k+1);
return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return false;obj->head++;obj->head=(obj->head)%(obj->k+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return -1;return obj->a[obj->head];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return -1;return obj->a[(obj->tail-1+obj->k+1)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}/*** Your MyCircularQueue struct will be instantiated and called as such:* MyCircularQueue* obj = myCircularQueueCreate(k);* bool param_1 = myCircularQueueEnQueue(obj, value);* bool param_2 = myCircularQueueDeQueue(obj);* int param_3 = myCircularQueueFront(obj);* int param_4 = myCircularQueueRear(obj);* bool param_5 = myCircularQueueIsEmpty(obj);* bool param_6 = myCircularQueueIsFull(obj);* myCircularQueueFree(obj);
*/

以上代码就是我们在力扣网上运行的代码。

三.结言

本题的分享就到这了,有兴趣的小伙伴,能不能给个三连,真的求求了。

帅哥美女们,咱们下期再见。

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

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

相关文章

50.WEB渗透测试-信息收集-CDN识别绕过(3)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:49.WEB渗透测试-信息收集-CDN识别绕过(2) 关于cdn的识别方法内容…

Leecode热题100--73:矩阵置零

题目: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 C: 思路: 可以使用两个数组来记录哪些行和列需要被置零。 首先,我们遍历整个矩阵,…

设计模式--享元模式

引言 享元模式(Flyweight Pattern)作为一种高效节省内存的结构型设计模式,其核心在于通过共享技术有效支持大量细粒度对象的重用,从而减少内存占用,提高系统性能。特别是在处理大量相似对象的场景下,享元模…

智慧监狱人员行为识别监测系统

智慧监狱人员行为识别监测系统是基于神经网络AI视觉智能分析算法开发的技术。智慧监狱人员行为识别监测系统利用现场监控摄像头,通过对人体活动骨架的结构化分析,根据人体运动轨迹定义了多种异常行为,从而实现对监舍内的静坐不动、离床、攀高…

Tron节点监控脚本使用说明

文章目录 一、配置二、脚本编写2.1 Python脚本--监控节点是否正在同步2.1.1 pyton脚本脚本示例2.1.2 使用说明2.2.3 脚本监控内容说明 2.2 Shell脚本--综合情况监控2.2.1 shell脚本示例2.2.2 使用说明2.2.3 脚本监控内容说明 最近搭建了TRON节点,为了防止节点在生产…

Mixiy(米思齐)安装

Mixiy(米思齐)安装 官网地址:爱上米思齐 打开官网,选择下图的软件进行下载 复制提取码,点击链接跳转到网盘进行下载,选择(RC4完整版) 下载完成后,解压到合适的位置,进入文件夹,双击Mixly.exe即…

Docker 部署Jenkins

1、运行镜像 docker run --namejenkins \--restartalways \--privilegedtrue \-u root \-p 8080:8080 \-p 50000:50000 \-v /home/docker/jenkins/jenkins_home:/var/jenkins_home \-v /usr/bin/docker:/usr/bin/docker \-v /var/run/docker.sock:/var/run/docker.sock \-e TZ…

【Crypto】MD5

文章目录 MD5解题感悟 MD5 提示的很明显MD5 小小flag,拿下! 解题感悟 没啥感悟…

Java输入与输出详解

Java输入和输出 前言一、Java打印Hello World二、输出到控制台基本语法代码示例格式化字符串 三、从键盘输入读入一个字符正确写法 使用 Scanner 读取字符串/整数/浮点数使用 Scanner 循环读取 N 个数字 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这…

使用 Java 和 MyBatis 实现动态排序的多表查询

相关 java实现一个根据字段和排序方式进行排序 java实现自定义排序 自定义动态排序 前言 在Web开发中,前端通常会传递一些参数来决定数据的排序方式,例如排序字段和排序方向。本文将展示如何在 Java 项目中结合 MyBatis 实现动态排序,尤其…

MySQL-性能分析

1、数据库服务器的优化步骤 2、查看系统性能参数 可以使用show status语句查询一些MySQL数据库服务器的性能参数 执行频率语法格式:show [ global | session ] status like 参数 ;常用性能参数如下所示 参数名说明connection连接MySQL服务器的次数upti…

Autodesk 3ds Max下载,3ds MAX 2024三维建模渲染软件安装包下载安装

3ds MAX中文版,其强大的功能和灵活的操作为广大用户提供了无限的创意空间,使得高质量动画、最新游戏、设计效果等领域的制作需求得以完美满足。 ​ 作为一款三维建模软件,3ds MAX中文版具备极高的建模精度和渲染质量。它支持多种建模方式&am…

【Fiddler抓包工具】第四节.断点设置和弱网测试

文章目录 前言一、断点设置 1.1 全局断点 1.2 局部断点 1.3 打断点的几种常用命令 1.4 篡改响应报文二、弱网测试 2.1 网络限速 2.2 精准限速总结 前言 一、断点设置 1.1 全局断点 特点: 中断Fiddler捕获的所有请求,包括…

记录一次prometheus因时区不同导致的无法获取数据问题

一、故障出现原因 prometheus机器压力过大,内存耗尽,负载飙高,导致无法登录; 于是从公有云web界面进行重启,重启后内存还是不足,负载很快升高; 对机器进行配置变更,由4C8G升级为4…

在链游中,智能合约如何被用于实现游戏内的各种功能

随着区块链技术的快速发展,链游(Blockchain Games)作为区块链技术的重要应用领域之一,正逐渐展现出其独特的魅力和优势。其中,智能合约作为链游的核心技术之一,对于实现游戏内的各种功能起到了至关重要的作…

【C++初阶】—— 类和对象 (下)

📝个人主页🌹:EterNity_TiMe_ ⏩收录专栏⏪:C “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 类和对象 1. 运算符重载运算符重载赋值运算符重载前置和后置重载 2. 成员函数的补充3. 初始化列…

Java的函数式接口和 Lambda 表达式

在 Java 8 中,可以通过使用函数式接口和 Lambda 表达式来实现类似 JavaScript 中将函数作为参数传递的功能。 以下是一个简单的示例,演示如何在 Java 中使用函数式接口将函数作为参数传递: 定义一个函数式接口(函数式接口是只有…

CentOS上升级glibc2.17至glibc2.31

glibc是Linux系统中的重要组件之一。在CentOS中,glibc通常是作为系统的默认C标准库使用的,因为它是许多软件的基础库。在CentOS中,glibc的版本通常与CentOS版本一起发布。因为CentOS通常会优先选择稳定性而不是最新性,所以CentOS使…

Vue项目如何进行XSS防护

前言 在目前主推网络安全的情况下,很多开发项目都需要在上线前进行渗透测试,当符合渗透测试标准及没有安全漏洞即可正常上线,当前还会有代码审计的,这个另当别论。 如何对XSS进行防护 在很多的富文本编辑器项目中,x…

leecode热题100---994:腐烂的橘子

题目: 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回…