栈与队列:设计循环队列

news2024/12/23 19:09:30

目录

题目🔥:

数据模型: 

本题大意: 

思路分析: 

代码分析:

一、定义队列

二、初始化、判断队列的空和满⭐

初始化:

空满的判断:

三、入队和出队🎇

入队:

出队:

总结:

四、获取队头元素和获取队尾元素

关于队尾:

五、销毁队列 

完整代码:


 

题目🔥:

  • 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
  • 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

数据模型: 

                                  

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

题目内容: 

本题大意: 

给予队列固定的长度值,当队列的长度等于固定的长度值后,任何的插入都无效,且队列进行出队后,并不会进行空间的释放(如果以链表形式创造),而出队后空下的空间会进行重复利用,以此达成循环要求。

思路分析: 

对于本题的队列,我们有两种创建方式,第一种是数组为底层进行创建,第二种是以链表的形式进行创建。

如果是链表的形式,我们可以采取单链表或则双向链表,因为链表循环的独特优越性,我们会在插入删除创建的问题上方便很多,但是当我们在获取队尾元素的时候,就会十分的复杂,因为需要遍历。

而如果选择数组为底层进行创建,那么重点就是循环的体现和队列的空满表现。

而对于本题,采取数组的方法较好一些。

代码分析:

一、定义队列

  • 因为,我们采取数组的方法解决问题,所以构建一个数组类型的结构体,也就是顺序表。
  • 同时因为是队列,我们需要队头、队尾、又因为因为选择数组,所以设计一个数组的空间指针,因为由限定长度,所以设计一个长度限定K。

二、初始化、判断队列的空和满⭐

初始化:

关于队列的初始化,需要考虑一些问题:

  • 队头和队尾指针,究竟代表的意思?
  • 如何判断队列的空和满?

第一个问题:

  • 因为本队列的底层是数组,所以back和 front 本质上是表示数组的下标,那么当我们进行初始化时,下标改如何定义?
  • 如果定义front ==0 back ==0 那么当我们入队时,back 是否改前进?这个问题和之前栈的栈顶和栈底关系一样  栈和队列:栈-CSDN博客
  • 所以,如果我们的初始化 back == 0那么back 表达的就是 队尾的后面一个位置的下标。

第二个问题:

  • 队列的空和满其实分为两种状态,如果是没有进入循环的状态下,当front == back  ==0时,可以表示队列是空的,即便back的意思是 队尾的后一个位置下标 
  • 但是当进入循环后,back == front == 0 后,其实可以表达队伍已经满了

                                     

  • 所以,对这种问题,我们可以采取两种方法,第一种是设置一个长度,当长度==0时表示空队列,当长度不等于空时则是满队列(仅限于在空满函数中进行)
  • 但是这种方法并不方便,于是我们设置了另一个方法,那就我们在初始化的时候可以多开一个位置
  • 也就说如果题目要求我们的开辟能够存储四个元素的队列是,我们开辟五个空间,且多出的这个空间是可以进行存储数据的,那么我们的判断条件发生了改变。

空满的判断:

obj->front == obj->back;
  • 如果队列是空,那么back == front 是恒成立的,在开辟了一个空间后,队列满了之后,队头指针的队尾指针二者始终差距一步,这是因为多开辟了空间之后,空间的长度始终大于队列的长度,以及队尾指针back 指向的是队尾后面一个位置 

(obj->back+1) % (obj->k+1) == obj->front;

  • 如何判断是否是满?这里分了两种情况,第一种没有进入循环,也就说队头位置没有变化,队尾指针指向了最后一个下标位置,在这种情况下,队列满了。
  • 第二种,在多次的插入和删除后,back指针在front指针前面一个位置,在这种情况下满了。
  • 而这两种情况下,都有一个共同点!长度!
  • 无论是进入循环前还是进入循环后,back指针所处在的位置(队尾后一个位置,数组是从0开始的)和空间的长度 进行 % 得出的结果如果和front 指针指向的位置一样,那么队列就满了!
  • 主要是利用了 % 操作符的特点, 一个数 a % 比它大的数 b  = 这个数本身 a 

三、入队和出队🎇

入队:

因为,back是指向队尾后一个位置,所以直接使用即可

但是因为题目要求插入成功为真,所以我们要进行判断,是不是队列满了于是我们就可以调用之前的判断是否满了的函数,且又因为会出现下图情况:

                               

所以还需要对back的指向进行调整。

出队:

删除其实只需要移动队头指针就行了,当然需要由元素存在,所以还得判断是否是空的!

同时也需要注意循环的问题:

                      

总结:

  • 其实插入和删除面对循环的调整都是利用了 % 和循环的特点,++都会时front 和back 变大,而进入循环后,% 空间的大小 后得到的数字就相当于进入了循环后所处在的位置。
  • 而如果++后front 和back 的数字都比空间大小 小,那么 % 后得到的数字还是他们本身,也就表示没有进入循环

四、获取队头元素和获取队尾元素

  • 队头直接获取即可,因为队头不论如何移动都只是获取队头指针指向的元素
  • 而获取队尾,则是要获取队尾指针指向的下标-1后的元素,所以关于队尾指针会有一些改动 

关于队尾:

在正常情况下获取队尾是这样的

但是不正常情况,也就说循环后,back指针指向的是数组的0下标位置,当这个back-1后就是越界了而且这时候的队尾元素其实就是队列数组下标为k的元素

所以,这里再次利用了 % 的特点:一个数 a % 比它大的数 b  = 这个数本身 a 

  • 所以如果我们进入了循环后或则进入循环前,这个back指针指向的下标是比空间长度小的,所以加上空间长度在%长度空间长度,得出的数字还是这个数
  • 而如果back指向的是0,而再进来了-1后,再加上空间长度,%之后得出的就是数组的最后位置的数字最后位置的下标

五、销毁队列 

完整代码:


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

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

相关文章

LeetCode【32】最长的有效括号

题目: 思路: 括号字符串依次入栈,删除匹配的成对括号。最后栈中留下的都是无法匹配的断点。这些断点的差值减一就是断点间有效括号串的长度,取这些长度的最大值即可。 例如括号字符串 “)()((())(”,最后留在栈中的…

比Postman强在哪里

Postman的受众对象主要是广大开发人员,调测使用,它并不能完全满足专业测试人员需求,而自动化测试平台可以 1,Postman,Jmter是单机版软件,类似打游戏你和电脑PK,而很多时候是要联网和其他人团队作…

LeetCode【36】有效的数独

题目: 思路: https://blog.51cto.com/u_15072778/3788083 代码: public boolean isValidSudoku(char[][] board) {// 二维数组第一个标识 0-9行,第二个表示 0-9数字,存的内容boolean 表示第0-9行,0-9这些…

系列十二、强引用、软引用、弱引用、虚引用分别是什么?

一、整体架构 二、强引用(默认支持模式) 2.1、概述 当内存不足时,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。 强引用是我们最常见的普通对象引用,只…

INFINI Labs 产品更新 | 发布 Easysearch Java 客户端,Console 支持 SQL 查询等功能

近年来,日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志,挖掘日志数据价值,驱动运维、运营,提升服务管理效率。 方案架构 Beats 是轻量级采集器,包括 Filebeat、Metricbeat 等。E…

我叫:选择排序【JAVA】

1.我是个啥子?? 选择式排序:属于内部排序法,从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 2.我的思想 基本思想:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第…

【Promise12数据集】Promise12数据集介绍和预处理

【Segment Anything Model】做分割的专栏链接,欢迎来学习。 【博主微信】cvxiayixiao 本专栏为公开数据集的介绍和预处理,持续更新中。 要是只想把Promise12数据集的raw形式分割为png形式,快速导航,直接看2,4标题即可 …

个人博客添加访问人数以及访问时间-githubpage

layout: post # 使用的布局(不需要改) title: 个人博客添加访问人数以及访问时间 # 标题 subtitle: 个人博客优化 #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: tr…

centos7 探测某个tcp端口是否在监听

脚本 nc -vz 192.168.3.128 60001 if [ $? -eq 0 ]; thenecho "tcp succeed" elseecho "tcp failed" fi nc -vz 192.168.3.128 60001 探测192.168.3.128服务器上60001 tcp端口, -vz说明是探测TCP的 端口开启的情况 执行脚本 端口禁用情况 执行脚本

054-第三代软件开发-信号槽

第三代软件开发-信号槽 文章目录 第三代软件开发-信号槽项目介绍信号槽实现原理与MFC消息映射机制区别Qt信号槽机制的优缺点 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML&#x…

Vue中实现div的任意移动

前言 在系统应用中,像图片,流程预览及打印预览等情况,当前视窗无法全部显示要预览的全部内容,设置左右和上下滚动条后,如果用鼠标拖动滚动条,又不太便利,如何用鼠标随意的移动呢? …

Apache ECharts简介

二十九、Apache ECharts 29.1 介绍 Apache ECharts 是一款基于 JavaScript 的数据可视化图表库,提供直观、生动、可交互、可个性化定制的数据可视化图表。 官网地址:https://echarts.apache.org/zh/index.html 常见效果展示: 1). 柱形图 …

定点整数、小数

文章目录 一、定点整数二、定点小数三、定点小数的加/减运算 一、定点整数 二、定点小数 三、定点小数的加/减运算 对两个定点小数A、B进行加法/减法时,需要先转换为补码 计算机硬件如何做定点小数补码的加法:从最低位开始,按位相加&#x…

【评估分级方法】自然断点法(Python实现全代码)

自然断点法 自然断点法有两个称呼,一个就是直接英文名称,叫做“Natural Breaks”,这就不解释了,还有一个称呼就是ArcGIS里面用的,叫做“Jenks”,主要是来源于它的创造者:乔治弗雷德里克詹克斯&…

Vulhub靶场-KIOPTRIX: LEVEL 1.1

目录 环境配置 端口扫描 漏送发现 漏送利用 提权(内核漏洞提权) 环境配置 环境配置的过程同主页该专栏第一个靶场,不在赘述。 端口扫描 首先通过arp-scan并根据靶机的mac地址确定靶机的IP地址 然后对靶机进行一个扫描 首先扫描到OpenS…

自动驾驶学习笔记(九)——车辆控制

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 控制器设计 比例积分微分控制 线性…

NI Package Manager创建程序包

NI Package Manager创建程序包 要使用PackageManager创建程序包,即把相关的组件都放在一个目录下,使用命令行创建程序包。 程序包是一个压缩文件,包含要安装到目标位置的所有文件。Package Manager创建的程序包扩展名为.nipkg。可以使用Pack…

QFile文件读写操作QFileInFo文件信息读取

点击按钮选择路径,路径显示在lineEdit中 将路径下的文件的内容放在textEdit中 最后显示出来 !file.atend()//没有读到文件尾就一直读 file.readline表示按行进行读 追加的方式进行写 要是重新写的话用file.open(QIODevice::write) 用QFileInFo来读取…

微服务实战系列之Gateway

前言 人类世界自工业革命以来,无论从金融、货币、制度,还是科技、资源、社会各个方面,都发生了翻天覆地的变化。物质极大丰富,从而也推动了科技的极速发展。当计算机问世也仅仅不到80年,而如今我们的生活处处有它的影子…

阿里云ECS11月销量王 99元/年

这一波好像真没得说,老用户居然都有份,买来练习、测试冒似已经够了! 阿里云ECS11月销量王 99元/年 2核2G 3M固定带宽不限流量,新老同享,新购、续费同价,开发必备! 活动规则 云服务器ECS 云创季…