当前位置: 首页 > 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…...

进程,线程

进程是操作系统分配资源的基本单位&#xff0c;线程是CPU调度的基本单位。 PCB&#xff1a;进程控制块&#xff0c;操作系统描述程序的运行状态&#xff0c;通过结构体task,struct{…}&#xff0c;统称为PCB&#xff08;process control block&#xff09;。是进程管理和控制的…...

第03章_基本的SELECT语句

第03章_基本的SELECT语句 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展…...

干货 | 简单了解运算放大器...

运算放大器发明至今已有数十年的历史&#xff0c;从最早的真空管演变为如今的集成电路&#xff0c;它在不同的电子产品中一直发挥着举足轻重的作用。而现如今信息家电、手机、PDA、网络等新兴应用的兴起更是将运算放大器推向了一个新的高度。01 运算放大器简述运算放大器&#…...

C++定位new用法及注意事项

使用定位new创建对象&#xff0c;显式调用析构函数是必须的&#xff0c;这是析构函数必须被显式调用的少数情形之一&#xff01;&#xff0c; 另有一点&#xff01;&#xff01;&#xff01;析构函数的调用必须与对象的构造顺序相反&#xff01;切记&#xff01;&#xff01;&a…...

【Android笔记75】Android之翻页标签栏PagerTabStrip组件介绍及其使用

这篇文章,主要介绍Android之翻页标签栏PagerTabStrip组件及其使用。 目录 一、PagerTabStrip翻页标签栏 1.1、PagerTabStrip介绍 1.2、PagerTabStrip的使用 (1)创建布局文件...

【Kafka】【二】消息队列的流派

消息队列的流派 ⽬前消息队列的中间件选型有很多种&#xff1a; rabbitMQ&#xff1a;内部的可玩性&#xff08;功能性&#xff09;是⾮常强的rocketMQ&#xff1a; 阿⾥内部⼀个⼤神&#xff0c;根据kafka的内部执⾏原理&#xff0c;⼿写的⼀个消息队列中间 件。性能是与Kaf…...

现代 cmake (cmake 3.x) 操作大全

cmake 是一个跨平台编译工具&#xff0c;它面向各种平台提供适配的编译系统配置文件&#xff0c;进而调用这些编译系统完成编译工作。cmake 进入3.x 版本&#xff0c;指令大量更新&#xff0c;一些老的指令开始被新的指令集替代&#xff0c;并加入了一些更加高效的指令/参数。本…...

how https works?https工作原理

简单一句话&#xff1a; https http TLShttps 工作原理&#xff1a;HTTPS (Hypertext Transfer Protocol Secure)是一种带有安全性的通信协议&#xff0c;用于在互联网上传输信息。它通过使用加密来保护数据的隐私和完整性。下面是 HTTPS 的工作原理&#xff1a;初始化安全会…...

Docker的资源控制管理

目录 一、CPU控制 1、设置CPU使用率上限 2、设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 3、设置容器绑定指定的CPU 二、对内存使用进行限制 1、创建指定物理内存的容器 2、创建指定物理内存和swap的容器 3、 对磁盘IO配额控制&#xff08;blkio&a…...

MMSeg无法使用单类自定义数据集训练

文章首发及后续更新&#xff1a;https://mwhls.top/4423.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 摘要&#xff1a;将三通道图像转为一通道图像&#xff0c;…...

网站开发技术发展历程/搜索引擎成功案例分析

一般指示灯正常发光的电流在10~20mA,低电流LED灯的工作电流在2mA一下&#xff0c;亮度和普通的一样。 压降 电流 红色 1.82~1.88V 5~8mA 绿色 1.75~1.82V 3~5mA 橙色 1.7~1.8V …...

苏州网站优化企业/网络推广专员是干什么的

前言 在本篇文章开始前&#xff0c;我想想来回答一个问题&#xff1a;我为什么要写这一篇关于面试的文章&#xff1f; 原因有三&#xff1a;第一&#xff0c;我想为每一个为梦想时刻准备着的”有心人“尽一份自己的力量&#xff0c;提供一份高度精华的Java面试清单&#xff1…...

佛山网站建设方案/百度广告推广怎么做

1057 数零壹 (20 分) 题目链接 算法分析 从字符串第一位开始到最后一位&#xff0c;如果是小写或大写的字母&#xff0c;依次更新sum的值&#xff0c;然后转化为二进制数&#xff0c;统计0和1的个数 代码实现 #include<bits/stdc.h> using namespace std;int main()…...

做落地页的网站/怎么制作一个简单的网页

♣题目部分在Oracle中&#xff0c;基表COL_USAGE$的作用是什么&#xff1f;♣答案部分从Oracle 9i开始引入了SYS.COL_USAGE$表用来跟踪列的使用情况&#xff0c;该功能通过隐含参数“_COLUMN_TRACKING_LEVEL”来控制。若隐含参数“_COLUMN_TRACKING_LEVEL”的值为0则取消该功能…...

上海网站制作网站建设/线上销售培训机构

上个月导师要我做的一个小爬虫&#xff0c;分享一下过程 需求分析 目标url&#xff1a;AWS Fargate 价格-无服务器容器服务-AWS云服务 (amazon.com) 需要爬取网页中Fragate Spot的价格&#xff0c;但是不同区域价格不一样&#xff0c;并且价格每隔几个小时会有变化&#xff0c;…...

外贸b2b选品/谷歌seo搜索引擎

IE问题解决办法文章由小编整理发出&#xff0c;内容真实有效&#xff0c;欢迎提出您的意见IE系列文章由小编在互联网中整理并且发出&#xff0c;内容保障真实健康.IE浏览器怎么将网页保存为pdf文档很多小伙伴们都不清楚&#xff0c;接下来小编带来将网页保存为pdf文档的方法说明…...