当前位置: 首页 > news >正文

循环队列来了解一下!!

笔者在之前的一篇文章,详细的介绍了:队列之单向链表与双向链表的模拟实现:https://blog.csdn.net/weixin_64308540/article/details/128742090?spm=1001.2014.3001.5502 感兴趣的各位老铁,可以参考一下啦!

下面进入循环队列的讲解部分:

对于队列,在这个之前我们就已经知道:需要用数组来实现!!数组!

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。 环形队列通常使用数组实现。

当我们给其下标的时候:

假设:我们在里面存储数据的时候:

每次存储一个数据,那么rear就往后走一步!当这个情况下:

  1. rear从7下标如何到0下标??(怎么过去?)

  1. 假设rear从7下标已经到0下标,那么此时,到底是满了?还是没满??这也是一个值得思考的问题!!

  1. 需要注意以下的这种情况:

在这种情况下:当我们一边存储,一边删除,那么就会出现,不是在0下标相遇的情况!因此,我们需要注意:这种情况下,如何判断循环列表是否已经存储满了呢??

解决方案:

对于问题1:我们可以用:rear=(rear+1)%length,length表示数组长度!这样就可以实现数组下标的跨越!

对于问题2:我们可以定义usedSize记录存储的有效数据,通过usedSize与数组的长度相比,那么,我们就可以清晰的得出,循环列表是否存储满的结论!

对于如何判断循环列表满的情况:我们可以用牺牲一个空间来表示满!!

在这个思路过程中,我们可以让rear先走一步,看看是否与front相遇,若相遇(上图的情况)则为满!在上图中:我们牺牲rear所对应的空间来表示满!!

经过上述的讲解,那么,我们已经知道了循环列表的操作,及其思路,接下来我们就可以:设计循环队列了!:622. 设计循环队列 - 力扣(LeetCode)

622. 设计循环队列

难度中等440收藏分享切换为英文接收动态反馈

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

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

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。

  • Front: 从队首获取元素。如果队列为空,返回 -1 。

  • Rear: 获取队尾元素。如果队列为空,返回 -1 。

  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。

  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。

  • isEmpty(): 检查循环队列是否为空。

  • isFull(): 检查循环队列是否已满。

示例:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,队列已满
circularQueue.Rear();  // 返回 3
circularQueue.isFull();  // 返回 true
circularQueue.deQueue();  // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();  // 返回 4

提示:

  • 所有的值都在 0 至 1000 的范围内;

  • 操作数将在 1 至 1000 的范围内;

  • 请不要使用内置的队列库。

经过上述 的题目分析,我们可以写出一下的简单代码:

首先,根据题目中的代码,我们定义了一个:MyCircularQueue的类!

然后我们开始进行代码的准备阶段:

    private int[] elem;//数组private int front;//表示列表的头private int rear;//表示列表的尾

在之前的分析中,我们知道,循环队列的底层是一个数组,因此,我们第一了一个数组,一个front表示列表的头,rear表示列表的尾!!

根据构造器来定义数组的长度为k,但是,由于我们所用的是:浪费一个空间来表示满的情况:因此我们需要多定义一个数组的长度:k+1

   //构造器,设置队列的长度为kpublic MyCircularQueue(int k){//如果是浪费空间,这里必须多加一个!this.elem=new int[k+1];}
  1. 入队列:向循环列表中插入一个元素,如果插入成功则返回true

    //入队列:向循环列表中插入一个元素,如果插入成功则返回truepublic boolean enQueue(int value){//检查队列是否为满??if (isFull()){return false;//在不扩容的情况下,满了,就不能入!}//在队列不满的情况下elem[rear]=value;//存放数据rear=(rear+1)%elem.length;//确保循环return true;}

在这个里面,我们用了一个检查队列是否为满的判断,所以:……

 //检查循环队列是否为满?public boolean isFull(){//第一种写法if ((rear+1)%elem.length==front){return true;}return false;//第二种写法://return (rear+1)%elem.length==front;}

其实这个第二种的写法,很简单!很简单!

  1. 从循环队列中删除一个元素,如果成功删除,则返回true

  //从循环队列中删除一个元素,如果成功删除,则返回truepublic boolean deQueue(){if (isFull()){return false;}front=(front+1)% elem.length;return true;}

对于上述的这个代码,通过front往后走了一步,此时数据还在循环队列里面,但是,由于没有记录下来,所以,便就相当于删除了!

  1. 从队列的队首获取元素,如果队列为空,则返回-1

   //从队列的队首获取元素,如果队列为空,则返回-1public int Front(){if (isFull()) {return -1;}//得到对头元素return elem[front];}

这个代码很简单,笔者就不再详细的介绍了!

  1. 获取队列的队尾元素,如果队列为空,则返回-1

    //获取队列的队尾元素,如果队列为空,则返回-1public int Rear(){if (isEmpty()){return -1;}//得到队尾元素int index=(rear==0)?elem.length-1 :rear-1;return elem[index];}

对于这个问题,我们需要思考的是:rear在0下标的时候,若直接返回elem[rear-1],可能会造成越界!!因此我们才有着上述的: int index=(rear==0)?elem.length-1 :rear-1; return elem[index];

在上述的过程中,我们使用了检查数组是否为空的情况:isEmpty()

 //检查数组是否为空public boolean isEmpty(){return front==rear;//相遇}

上述便是我们的全部思路,因此,我们的整体代码为:

public class MyCircularQueue {private int[] elem;//数组private int front;//表示列表的头private int rear;//表示列表的尾//构造器,设置队列的长度为kpublic MyCircularQueue(int k) {//如果是浪费空间,这里必须多加一个!this.elem = new int[k + 1];}//入队列:向循环列表中插入一个元素,如果插入成功则返回truepublic boolean enQueue(int value) {//检查队列是否为满??if (isFull()) {return false;//在不扩容的情况下,满了,就不能入!}//在队列不满的情况下elem[rear] = value;rear = (rear + 1) % elem.length;return true;}//检查循环队列是否为满?public boolean isFull() {//第一种写法if ((rear + 1) % elem.length == front) {return true;}return false;//第二种写法://return (rear+1)%elem.length==front;}//从循环队列中删除一个元素,如果成功删除,则返回truepublic boolean deQueue(){if (isFull()){return false;}front=(front+1)% elem.length;return true;}//从队列的队首获取元素,如果队列为空,则返回-1public int Front(){if (isFull()) {return -1;}//得到对头元素return elem[front];}//获取队列的队尾元素,如果队列为空,则返回-1public int Rear(){if (isEmpty()){return -1;}//得到队尾元素int index=(rear==0)?elem.length-1 :rear-1;return elem[index];}//检查数组是否为空public boolean isEmpty(){return front==rear;//相遇}
}

若有不懂得地方,可以私聊我一下!!

相关文章:

循环队列来了解一下!!

笔者在之前的一篇文章,详细的介绍了:队列之单向链表与双向链表的模拟实现:https://blog.csdn.net/weixin_64308540/article/details/128742090?spm1001.2014.3001.5502 感兴趣的各位老铁,可以参考一下啦!下面进入循环…...

Idea打包springboot项目war包,测试通过

pom.xml文件 <!--包名以及版本号&#xff0c;这个是打包时候使用&#xff0c;版本可写可不写&#xff0c;建议写有利于维护系统--> <artifactId>tsgdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <!--打包形式--> <packaging&…...

python+django高校师生健康信息管理系统pycharm

管理员功能模块 4.1登录页面 管理员登录&#xff0c;通过填写注册时输入的用户名、密码、角色进行登录&#xff0c;如图所示。 4.2系统首页 管理员登录进入师生健康信息管理系统可以查看个人中心、学生管理、教师管理、数据收集管理、问卷分类管理、疫情问卷管理、问卷调查管理…...

CUDA中的流序内存分配

文章目录CUDA中的流序内存分配1. Introduction2. Query for Support3. API Fundamentals (cudaMallocAsync and cudaFreeAsync)4. Memory Pools and the cudaMemPool_t注意&#xff1a;设备的内存池当前将是该设备的本地。因此&#xff0c;在不指定内存池的情况下进行分配将始终…...

开源、低成本的 Xilinx FPGA 下载器(高速30MHz)

目前主流的Xilinx下载器主要有两种&#xff1a;一种是Xilinx官方出品的Xilinx Platfom Cable USB&#xff0c;还有一个就是Xilinx的合作伙伴Digilent开发的JTAG-HS3 Programming Cable。 JTAG-HS系列最大支持30MHz下载速度&#xff0c;基于FTDI的FT2232方案。 JTAG-HS系列对比…...

Maven专题总结

1. 什么是Maven Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a; Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和…...

谷粒商城--SPU和SKU

目录 1.SPU和SKU概念 2.表的关系理解 3.导入前端代码 4.完善后端接口 5.属性分组详情 6.规格参数详情 7. 销售属性详情 8.分组与属性关联 9.发布商品 10.仓库服务 1.SPU和SKU概念 SPU&#xff1a;standard product unit(标准化产品单元)&#xff1a;是商品信息聚合的…...

二叉树OJ题(上)

✅每日一练&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 题目的意思是俩棵树的结构不仅要相同&#xff0c;而且每个节点的值还要相同&#xff0c;如果满足上面2个条件&#xff0c;则成立&#xff01; 解题思路&#xff1a; 从三个方面去考虑&#xff1…...

第一章 PDF语法

第一章 PDF语法PDF ObjectsNull ObjectsBoolean ObjectsNumeric ObjectsName ObjectsString ObjectsArray ObjectsDictionary ObjectsName treesNumber treesStream ObjectsDirect versus Indirect ObjectsFile StructureWhite-SpaceThe Four Sections of a PDFHeaderTrailerBo…...

IntelliJ IDEA 创建JavaFX项目运行

IntelliJ IDEA 创建JavaFX项目运行JavaFX官网文档&#xff1a;https://openjfx.io/openjfx-docs/ JavaFX 2008年12月05日诞生&#xff0c;是一个开源的下一代客户端应用程序平台&#xff0c;适用于基于 Java 构建的桌面、移动和嵌入式系统。这是许多个人和公司的协作努力&#…...

IC封装常见形式

参考&#xff1a;https://blog.csdn.net/dhs888888/article/details/127673300?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-127673300-blog-115610343.pc_relevant_multi_platform_whitelistv4&spm1001.2101.3001.4242…...

Linux通配符、转义符讲解

目录 通配符 通过通配符定义匹配条件 转义符 将所有的逻辑操作符都转换成字符 通配符 通过通配符定义匹配条件 * 任意字符都可以通配&#xff08;也可以匹配空值&#xff09; &#xff1f; 匹配单个字符 [a-z] 匹配单个的小写英文字母 [A-Z] 匹配单个的大写英文…...

[OpenMMLab]提交pr时所需的git操作

git开发流程 准备工作 作为一个开发者&#xff0c;fork一个仓库之后应该先做什么&#xff1f; 1、下载仓库&#xff0c;创建上游代码库&#xff0c;查看当前的分支情况 git clone https://github.com/<your_name>/<repo_name>.git git remote add upstream git…...

pandas——groupby操作

Pandas——groupby操作 文章目录Pandas——groupby操作一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤一、实验目的 熟练掌握pandas中的groupby操作 二、实验原理 groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, squeezeFalse&…...

webpack.config.js哪里找?react项目关闭eslint监测

目录 webpack.config.js哪里找&#xff1f; react项目关闭eslint监测 webpack.config.js哪里找&#xff1f; 在React项目中&#xff0c;当我们需要修改一些配置时&#xff0c;发现找不到webpack.config.js&#xff0c;是我们创建的项目有问题吗&#xff0c;还需新创建项目的项…...

OpenCV 图像梯度算子

本文是OpenCV图像视觉入门之路的第12篇文章&#xff0c;本文详细的介绍了图像梯度算子的各种操作&#xff0c;例如&#xff1a;Sobel算子Scharr算子laplacian算子等操作。 OpenCV 图像梯度算子目录 1 Sobel算子 2 Scharr算子 3 laplacian算子 1 Sobel算子 Sobel算子是一种图…...

Linux c编程之Wireshark

Wireshark是一个网络报文分析软件,是网络应用问题分析必不可少的工具软件。网络管理员可以使用wireshark排查网络问题。程序开发人员可以用来分析应用协议、定位分析应用问题。无论是网络应用程序开发人员、测试人员、部署人员、技术支持人员,掌握wireshark的使用对于分析网络…...

极客时间_FlinkSQL 实战

一、批处理以及流处理技术发展 1.Lambda架构三层划分Batch Layer、Speed Layer和Serving Layer。 ①、Batch Layer:主要用于实现对历史数据计算结果的保存,每天计算的结果都保存成为一个Batch View,然后通过对Batch View的计算,实现历史数据的计算。 ②、Speed Layer正是用…...

Pytorch 混合精度训练 (Automatically Mixed Precision, AMP)

Contents混合精度训练 (Mixed Precision Training)单精度浮点数 (FP32) 和半精度浮点数 (FP16)为什么要用 FP16为什么只用 FP16 会有问题解决方案损失缩放 (Loss Scaling)FP32 权重备份黑名单Tensor CoreNVIDIA apex 库代码解读opt-level (o1, o2, o3, o4)apex 的 o1 实现apex …...

使用太极taichi写一个只有一个三角形的有限元

公式来源 https://blog.csdn.net/weixin_43940314/article/details/128935230 GAME103 https://games-cn.org/games103-slides/ 初始化我们的三角形 全局的坐标范围为0-1 我们的三角形如图所示 ti.kernel def init():X[0] [0.5, 0.5]X[1] [0.5, 0.6]X[2] [0.6, 0.5]x[0…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...