每日一题(设计循环队列)

每日一题(设计循环队列)

622. 设计循环队列 - 力扣(LeetCode)

在这里插入图片描述

1.题意解读

本题只能为队列开辟k个单位空间,并且只能利用这几个空间进行数据的存储。

思路:本题使用数组来实现队列是比较方便的,首先定义两个变量:front和rear变量。分别用于记录队头和队尾。一开始初始化时让front和rear都指向数组的第一个位置,存储数据时,按着下图的方式,向rear下标处存储数据,存储成功之后rear自加1,也就是意味着rear始终指向的当前队尾元素的下一个位置。

分析假设k的值是5,那么本来应该就是开辟5个空间。但是我用的这种方法需要多开辟一个单位的空间。为什么呢?假若我们开辟的是5的单位的空间,那么当存满了k个数据之后,此时的rear和front就都指向了数组中的第一个元素。那么请仔细想想,在初始化的时候我们也将rear和front也初始化为了0,也指向了数组中的第一个元素。那么在这两种情况下,front和rear都指向了数组的第一个元素,但是队列中的元素个数却是大不相同,无法将队列为满和队列为空进行分开。为了避免这种问题的发生,这里多开辟一个空间,当rear下标的下一个位置是front时,此时队列中存储了k个元素,也就说明了队列已满,那么同时判断队列为空就很方便了。只要rear与front相等时,队列就为空。

删除队头元素:删除队头的元素就只需要将front++即可。

在这里插入图片描述

注意:

  • 当遇到了非常规情况时:rear到了队尾需要循环到队头时则只需要执行语句 rear++;rear %= k+1;这两条语句即可。针对front到达队尾需要到达队头的情况也同样适用的。
  • 当需要获取队尾的元素时,实际上获取的是rear的前一个下标处的值,需要访问rear-1下标处的值,但是假若此时的rear的值是0,那么此时需要特判以下,假如rear的值是0时,直接访问k下标处的值即可。rear的值不为0时,只需要正常访问rear-1下标处的元素即可。

在这里插入图片描述

代码实现:

typedef struct {int* a;int front;int rear;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue*  obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a = (int*)malloc(sizeof(int)*(k+1));obj->front = 0;obj->rear = 0;obj->k = k;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {assert(obj);return ((obj->rear)==(obj->front));
}bool myCircularQueueIsFull(MyCircularQueue* obj) {assert(obj);return (((obj->rear+1)%(obj->k+1))==(obj->front));
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {assert(obj);if(!myCircularQueueIsFull(obj))//未满{obj->a[obj->rear] = value;obj->rear++;obj->rear %= (obj->k+1);return true;}return false;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {assert(obj);if(!myCircularQueueIsEmpty(obj))//非空{obj->front++;obj->front %=obj->k+1;return true;}return false;
}int myCircularQueueFront(MyCircularQueue* obj) {assert(obj);if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) {assert(obj);if(myCircularQueueIsEmpty(obj)){return -1;}if(obj->rear == 0)return obj->a[obj->k];else{return obj->a[obj->rear-1];}
}void myCircularQueueFree(MyCircularQueue* obj) {assert(obj);free(obj->a);free(obj);obj=NULL;
}

完结

设计循环队列的分析就到这里啦,若有不足,欢迎评论区指正,下期见!

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

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

相关文章

网络是如何进行通信

网络是如何进行通信的 简介 在现代社会中,网络已经成为我们生活中不可或缺的一部分。从上网搜索信息、在线购物到远程工作和社交媒体,我们几乎无时无刻不与网络保持着联系。但是,网络究竟是个什么玩意,它是如何工作的呢&#xf…

OpenCV 01(图像加载与显示)

一、机器视觉 现在说的机器视觉(Machine Vision)一般指计算机视觉(Computer Vision), 简单来说就是研究如何使机器看懂东西。就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传…

道一云·七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口

道一云七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口 数据源平台:道一云七巧 道一云七巧拥有强大的自定义表单设计工具,并配置工作流程,通过流程智能流转,打通各个业务场景中的审批、协作环节,包含数据采集单、任务单…

用于独立系统应用的光伏MPPT铅酸电池充电控制器建模(Simulink实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【0906 C高级day1】 Linux中的文件相关指令

一、使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 grep "ubuntu" /etc/passwd | cut -d "/" -n -f 2-3 | cut -c 1-11 二、思维导图 文件相关指令:

WordPress(5)在主题中添加文章字数和预计阅读时间

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…

记一次生产环境服务卡死排查记录

接现场运维报告某java服务CPU狂飙,服务处于卡死无响应状态 询问现场运维什么场景造成的,答复是偶发现象,没有规律,和请求高峰期并没有关系。 因为服务是负载均衡的(A、B两台),临时处理让运维重…

go语言学习笔记

Go学习 一直想学一门新语言,难度又不想太大,C和Java都会但是不怎么精通,某天看到Go语言,好的,就是它了。总体来说,go语言的学习还是相对简单,有编程基础的入手很快。 简介 go是一种并发、带垃…

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分:表级锁、页级锁、行锁 为了提高数据库并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但管理锁是很耗资源(涉及获取、检查、释放锁等动作)。因…

全网超50万粉丝的Linux大咖良许,出书了!

全网超50万粉丝的Linux大咖良许 出书了! 今天我们要说的就是这本由Linux领域头部号主,良许老师编写的这本《速学Linux:系统应用从入门到精通》 如果你是刚开始学习Linux的小白同学,相信你已经体会到与学习一门编程语言相比&…

fastjson 1.2.24 反序列化导致任意命令执行漏洞复现

拉取docker容器 访问并抓包 修改为POST 方式,文件类型改为json格式,发送json数据包,发送成功 这里安装一个bp的插件 使用安装的插件 可以看到,插件告诉我们这里有漏洞,并且提供了POC 既然我们发现有 rmi ,…

【数字通信原理】笔记(持续更新ing)

通信原理学习笔记,课程见b站: 由于教材不同,我们的课程使用的是《数字通信原理》主编:李白萍 版本,因此此笔记以我们的教材为主整理up主的笔记。 详情见:通信原理 文章目录 第一章 绪论1. 通信的基本概念2. 信息的量度3. 通信系统的性能指标 …

【多思路附源码】2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策

赛题介绍 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬…

如何修改VS2017、VS2019、VS2022中C++默认版本

首先明确VS各个版本对C标准的支持情况: IC版本 VS版本 支持情况 C11 2015完全支持 ,13基本支持,12部分支持,10以及以下不支持 完全支持 C14 2017完全支持 ,15基本支持,13部分支持 完全支…

国内访问香港服务器选择什么路线?

​  国内访问香港服务器可以选择多种路线。首先,我们了解下各个线路的速度延迟。 一、CN2直连:解决了不同互联网服务提供商之间访问的难题,不需要绕到国际网络再从中国的三个网络入口进入。 二、优化直连:全国平均延迟60ms&…

UNIAPP之js/nvue混淆探索

因项目需要对UNIAPP的js混淆做了一些调研 混淆教程: https://uniapp.dcloud.net.cn/tutorial/app-sec-confusion.html 按照教程配置进行打包正式包进行混淆 下载正式包将 .ipa改为.zip 解压获取到HBuilder.app 右键显示包内容 获取到混淆的key 不同时间进行打包混淆同一文…

解决Microsoft Edge无法正常运行的有效方案分享!

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

【启扬方案】启扬多尺寸安卓屏一体机,助力仓储物料管理系统智能化管理

随着企业供应链管理的不断发展,对仓储物料管理的要求日益提高。企业需要实时追踪和管理物料的流动,提高物流效率、降低库存成本和减少库存的风险。因此,仓储物料管理系统的实现成为必要的手段。 仓储物料管理系统一体机作为一种新型的物料管理…

Linux:工具(vim,gcc/g++,make/Makefile,yum,git,gdb)

目录 ---工具功能 1. vim 1.1 vim的模式 1.2 vim常见指令 2. gcc/g 2.1 预备知识 2.2 gcc的使用 3.make,Makefile make.Makefile的使用 4.yum --yum三板斧 5.git --git三板斧 --Linux下提交代码到远程仓库 6.gdb 6.1 gdb的常用指令 学习目标: 1.知道…

Android jni引用第三方so动态库和.a静态库并且调用(c)方法

最近花了一周时间来入门学习 Android JNI方面的知识,因为后续的工作很多需要用到c c++库,我需要用jni来包装一下c函数,来提供给上次java调用。总之多学点知识对自己有好处。 案例效果: 上文我们讲解了 android studio cmake生成.a文件(静态库)及调用(c c++)静态库.a 本文…