力扣OJ题讲解——循环队列

今天我们一起来做一道关于队列的OJ题目,这是力扣题目622题,点击题目链接可以直接跳转,https://leetcode.cn/problems/design-circular-queue/

首先,我们看到要求,需要我们实现哪些功能? 

 我们需要设置队列长度K,队首元素,队尾元素,插入元素,删除元素,判断空,判断满。那这么多接口,我们要从哪里入手呢?我们现在做题无外乎要么用顺序表的方式,要么用链表的方式,使用两者其实都可以,今天我们就用顺序表的方式实现吧。既然使用顺序表也就是数组,那么我们要考虑一点,在什么情况下这个队列为空?要确定这个循环队列为空,那就需要保证,头元素的下标和尾元素的下标相等才可以,假设我们设头元素下标为front,back为尾元素下一个位置,因为我们要区分back=0时,到底是有一个元素还是没有元素的情况。即要保证front=back时,队列为空。

考虑了队列为空的情况,那什么时候循环队列满了呢?满了就是已经不能再放其它元素,也就是尾位置,back就要追上front了,也就是back=front吗?那我们想一想,队列为空的时候和队列为满的时候,都是front=back,我们要怎么区分这两种情况呢?

我们不妨设置队列长度K的时候多开一个空间,即k+1,我们保证k+1个空间最多只使用k个,留出一个位置,让back+1=front时为满队列。这样就能区分队列满和队列空的情况了。

下来我们开始做题。

typedef struct {
    int *a;//数组
    int front;//队首元素下标
    int back;//队尾元素下标的下一个位置
    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->back=0;
    obj->k=k;
    return obj;

}

为什么我们要给开k+1个空间呢?原因我们在上面讲过了,就是为了让队列满的情况时back+1=front。

下来我们先把容易实现的接口先完成,先把什么时候为空,什么时候为满实现。

为空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front==obj->back;
}

为满

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return obj->back+1=obj->front;//这样做合适吗?
}

 我们要考虑到,这是一个循环队列,下面这种情况能满足吗?

back要一直往后走吗? 显然不是,这是一个循环队列,当back走到k时,下一次就要回到起点,那怎么表示呢?我们不妨这样表示,(obj->back+1)%(obj->k+1)==obj->front,这个队列一共有k+1个空间,我们知道,如果一个小的数%一个比自己大的数是不会改变值的,所以,如果back+1=k+1,此时,back就要回到起点了。所以判断队列满我们可以这样写

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->back+1)%(obj->k+1)==obj->front;
}

 下面我们写插入接口

这是一个bool类型,也就是要返回true和false,那什么时候要返回false呢?注意这是往队列插入元素,如果队列已经满了,我们就插不了元素了。剩下就可以正常插入了,直接让obj->a[obj->back]=value即可,再让obj->back++。注意到这里,我们还要需要检查back有没有超过队列空间的大小,即我们需要在后面让obj->back%=obj->k+1;即

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

队列删除

删除接口同样是bool类型,我们要判断什么时候删除失败?当然就是队列为空的时候删除失败,我们要先检查队列是否为空,再删除,删除非常简单,直接让front++就可以了,front一直在++,有没有可能front也会超出队列的空间大小?当然有可能,所以我们也需要对front检查一下,即obj->front%=obj->k+1;

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

下面就是返回对头元素

题目里说了,如果队列为空就返回-1,这种情况我们也要处理一下,其余就直接返回obj->a[obj->front]即可。

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

 队尾元素

同样我们也要处理一次队列为空返回-1的情况,然后直接返回obj->a[obj->back-1]可以吗?

我们思考一下,如果back=0呢?我说的不是队列为空时,因为为空时我们已经处理了,我说的时当back已经走了至少一轮重新回到起点的情况,此时的back-1就成-1了,那我们怎么处理呢?我们要知道,这种情况下的back时已经被取模了k+1后,那我们不妨可以给back-1+k+1再给它取模k+1;即(obj->back-1)+(obj->k+1)%(obj->k+1);怎么理解这个公式,还是那句话,back-1不可能大于k+1,一个数%比他小的数值不变,(a+b)%b,如果a比b小且a是正数,那这个值是不变的,这一种情况也就对应了我们此处back!=0的情况,如果back=0,尾元素就在k的位置,那back-1就是-1,他再加上k+1再%k+1要比k+1小,所以结果就是k那个位置。

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

到这里这道题就大功告成了,此时我们运行,报了一个这样错误

是因为,我们在前面调用了就很多次队列为空为满的情况,也没有声明,所以我们可以把判断队列为空,为满挪到插入接口前面就可以啦。

好啦,本次题目就到这里了,希望大家能够多多支持,我们下次再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷2

单选题 1、两袋中分别有同样多的硬糖和酥糖,现将第一袋中的20块酥糖放到第二袋中,第二袋中的硬糖和酥糖相同,接着又将第二袋中的20块硬糖放到第一袋中,则第一袋中的硬糖是酥糖的4倍,问原来一袋中有(&#…

模电知识点总结(一)运算放大器

系列文章目录 文章目录 系列文章目录前言集成运算放大器基本线性运放电路虚短和虚断同向放大电路电压跟随器反向放大电路差分放大电路仪用放大器求和电路积分电路微分电路 前言 由于模电知识一直没用到,之前一直觉得没有什么用处,但是我越来越发现基础知…

基于Springboot的美容院管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的美容院管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(3)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 (制冷设备对于便利店为何如何重要?了解一下你所不知道的便利店和新零售行业。关 于电力线载波通信的论战。) 2、电路设计 2.1 防护电路 2.1.1 强电防护…

差分放大器工作原理(差分放大器和功率放大器区别)

差分放大器是一种特殊的放大器,它可以将两个输入信号的差异放大输出。其工作原理基于差分放大器的电路结构和差分输入特性。 一、差分放大器电路结构 差分放大器一般由四个基本电路组成:正反馈网络、反相输入端、共模抑制电路和差分输入端。其中&#xf…

云存储解决方案-阿里云OSS

云存储解决方案-阿里云OSS 1. 阿里云OSS简介 ​ 阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数…

纯干货丨电脑监控软件有哪些(三款电脑监控软件大盘点)

电脑监控软件在日常生活和工作中的应用越来越广泛。这些软件可以帮助我们监控电脑的使用情况,保护电脑的安全,提高工作效率。本文将介绍一些高人气的电脑监控软件,并分享一些纯干货。 1、 域之盾软件----电脑监控系统 是一款功能强大的电脑监…

渗透测试过程中的JS调试(一)

前言 前端调试是安全测试的重要组成部分。它能够帮助我们掌握网页的运行原理,包括js脚本的逻辑、加解密的方法、网络请求的参数等。利用这些信息,我们就可以更准确地发现网站的漏洞,制定出有效的攻击策略。前端知识对于安全来说,…

2023年中国雷达设备市场规模及市场份额分析[图]

雷达设备行业是一种利用无线电波对目标进行探测和定位的技术,也被称为无线电探测和定位。雷达通过发射电磁波对目标进行照射并接收其回波,经波形处理后获取目标的位置和速度等信息。雷达具有探测距离远,测定精度高,不受天气和地形…

如何正确复制CSDN文章到自己的博客

1.csdn 文章页面,按f12打开浏览器开发者工具 2.按ctrl f 找 "article_content" 3.在该元素源代码上右键 “Copy”->“Copy element” 4.新建一个txt文件,把你粘贴的东西复制进去,然后再把文件名的后缀改为html,然后打开html文件,把里面的内容ctrlA全部…

Java生成一个区域内的经纬度随机点的方式

准备: 1、四个角点(四个点确定一个框) 2、想要细分程度 (这里说的是经纬度,这里没有对经纬度做更细的区分) 如:0.000001约等于0.1m,0.00001约等于1m,0.0001约等于10m 。。…

【老文新发】Otsu大津法详解及python实现

原文:A Threshold Selection Method from Gray-Level Histograms A Fast Algorithm for Multilevel Thresholding 前言 大津法包含两个重要的概念:类间方差(between-class variance)和类内方差(within-class varianc…

opencv-图像轮廓

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 • 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检…

虹科分享 | 平衡速度与优先级:为多样化的实时需求打造嵌入式网络(3)——CAN与CANopen的实时能力与局限性

在回顾了选择具有实时能力的嵌入式通信系统的基本要求之后,我们现在将更详细地探讨CAN和CANopen的实时能力和局限性。 控制器局域网(CAN)协议是各个行业众多应用的基础,每个应用都有其独特的实时需求。CANopen和J1939等著名示例强调了该协议的多种适应性…

Python---变量的作用域

变量作用域:指的是变量的作用范围(变量在哪里可用,在哪里不可用),主要分为两类:局部变量和全局变量。 定义在函数外部的变量就称之为全局变量; 定义在函数内部的变量就称之为局部变量。 # 定义…

麒麟v10系统,在虚拟机上直接连公司同一个局域网,设置静态ip

1.更改配置信息 cd /etc/sysconfig/network-scripts vi ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FATALno IPV6_ADDR_GEN_MODEstable-pri…

小米智能摄像机云台版pro 拆解教程

拆解原因 因为设备提示无内存卡,摄像头手动调整方向到最上面,就可以看到内存卡插槽 但是这个摄像头因为内存卡弹出来了,导致无法插入也无法取出,所以决定拆开重新安装 第一步,拆开后即可拔出底座,拔掉摄像…

Vuetify:定制化、响应式的 Vue UI 库 | 开源日报 No.83

vuetifyjs/vuetify Stars: 38.1k License: MIT Vuetify 是一个无需设计技能的 UI 库,具有精美手工制作的 Vue 组件。它具有以下核心优势和主要功能: 可定制性:使用 SASS/SCSS 进行广泛自定义,并提供默认配置和蓝图。响应式布局&…

2023年中国合成云母行业现状及市场格局分析[图]

合成云母是一种通过化工原料经高温熔融冷却析晶而制得的单斜晶系矿物,属于典型的层状硅酸盐,许多性能都优于天然云母,如合成云母的耐温高达1200℃以上,而天然白云母在550℃下就会开始分解,金云母则在800℃开始分解。除…

Python中使用requests库遇到的问题及解决方案

目录 一、引言 二、问题1:无法导入requests库 三、问题2:请求超时 四、问题3:无法处理重定向 五、问题4:无法处理Cookies 六、问题5:无法上传文件 七、问题6:无法处理HTTPS请求 八、问题7&#xff…
最新文章