LeetCode——622设计循环队列

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/design-circular-queue/

1.题目

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 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 的范围内;
  • 请不要使用内置的队列库。

2.解析

我们设计循环队列的关键是要有效地利用数组空间,并且能够处理队列满和队列空的情况。下面是一种使用数组实现循环队列的解法,其中back=k+1的含义是为了区分队列满和队列空的情况

  • 首先,我们需要定义一个固定大小的数组a来存储队列元素,以及两个指针front和back来标记队列的头部和尾部。

  • 初始化时,将front和back都设置为0,表示队列为空。

  • 判断队列是否为空(isEmpty):

    • 判断front是否等于back,如果相等,则表示队列为空,返回true;否则,返回false。
  • 判断队列是否已满(isFull):

    • 判断(back+1)%k是否等于front,如果相等,则表示队列已满,返回true;否则,返回false。
  • 入队操作(enqueue):

    • 首先,判断队列是否已满,即(back+1)%k是否等于front。如果相等,则表示队列已满,无法继续入队。
    • 如果队列未满,则将元素放入back指向的位置,并将back指针向后移动一位,即back=(back+1)%k。
  • 出队操作(dequeue):

    • 首先,判断队列是否为空,即front是否等于back。如果相等,则表示队列为空,无法进行出队操作。
    • 如果队列不为空,则将front指向的元素出队,并将front指针向后移动一位,即front=(front+1)%k。
  • 获取队头元素(getFront):

    • 首先,判断队列是否为空,即front是否等于back。如果相等,则表示队列为空,无法获取队头元素。
    • 如果队列不为空,则返回front指向的元素。

3.代码总结

1.构造器函数,用于创建一个指定长度的循环队列。

首先,通过malloc函数动态分配了一个MyCircularQueue结构体的内存空间,并将其地址赋给指针变量obj。

然后,通过malloc函数再次动态分配了一个整型数组的内存空间,并将其地址赋给指针变量obj->a。这个数组的长度为k+1,多分配了一个空间用于判断队列是否满的条件。

接着,将队列的头指针front和尾指针back都初始化为0。

最后,将k的值赋给队列的长度k。

最终,返回指向创建的循环队列的指针obj。

MyCircularQueue* myCircularQueueCreate(int k)//构造器,设置队列长度为 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;
}

2. 检查循环队列是否为空

函数的返回值是一个bool类型的值,表示循环队列是否为空。

如果循环队列为空,则返回true,否则返回false。

函数的实现是通过比较循环队列的front和back的值来判断循环队列是否为空。

如果它们相等,说明队列中没有元素,即队列为空,返回true;否则返回false。

bool myCircularQueueIsEmpty(MyCircularQueue* obj)//检查循环队列是否为空。{return obj->front==obj->back;
}

3. 检查循环队列是否已满

函数的返回值是一个bool类型的值,表示循环队列是否已满。如果循环队列已满,则返回true,否则返回false。

函数的实现是通过计算(back+1)%(k+1)与front的值是否相等来判断循环队列是否已满。

如果它们相等,说明队列已满,返回true;否则返回false。

这里使用了取模运算来实现循环队列的特性。由于循环队列的尾部和头部相连,所以需要将back的下一个位置计算为(back+1)%(k+1),其中k为队列长度。如果这个值与front相等,说明队列已满。

bool myCircularQueueIsFull(MyCircularQueue* obj)//检查循环队列是否已满。{return (obj->back+1)%(obj->k+1)==obj->front;
}

4. 向循环队列插入一个元素

函数的返回值是一个bool类型的值,表示插入操作是否成功。

如果插入成功,则返回true;否则返回false。

函数的实现首先通过调用myCircularQueueIsFull函数来检查循环队列是否已满。

如果队列已满,则表示无法插入新元素,直接返回false。

如果队列未满,则将value值插入到队列的obj->back位置,并且将obj->back的值加1。为了保证obj->back在[0, k]的范围内,需要使用取模运算进行处理,即obj->back%=(obj->k+1)。这样可以使back的值在超出队列长度时重新回到队列起始位置。

最后返回true表示插入成功。

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)//向循环队列插入一个元素。如果成功插入则返回真。{if(myCircularQueueIsFull(obj)){return false;}obj->a[obj->back]=value;obj->back++;obj->back%=(obj->k+1);//将 obj->back 除以 (obj->k+1) 的余数,然后将结果赋值给 obj->back。return true;
}

5. 循环队列中删除一个元素

函数的返回值是一个bool类型的值,表示删除操作是否成功。

如果删除成功,则返回true;否则返回false。

函数的实现首先通过调用myCircularQueueIsEmpty函数来检查循环队列是否为空。

如果队列为空,则表示无法执行删除操作,直接返回false。

如果队列不为空,就执行删除操作。

即将obj->front的值加1,然后使用取模运算来确保obj->front在[0, k]的范围内。

最后返回true表示删除成功。

bool myCircularQueueDeQueue(MyCircularQueue* obj)//从循环队列中删除一个元素。如果成功删除则返回真。{if(myCircularQueueIsEmpty(obj)){return false;}obj->front++;obj->front%=(obj->k+1);return true;}

6.循环队列中获取队首元素

函数的返回值是一个int类型的值,表示队首元素。如果队列为空,则返回-1。

函数的实现首先通过调用myCircularQueueIsEmpty函数来检查循环队列是否为空。如果队列为空,则返回-1。

如果队列不为空,则直接返回obj->a[obj->front],即队首元素的值。

int myCircularQueueFront(MyCircularQueue* obj)//从队首获取元素。如果队列为空,返回 -1 。{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[obj->front];
}

 7.获取循环队列的队尾元素

  1. 首先判断队列是否为空,通过调用函数myCircularQueueIsEmpty(obj)来判断。如果队列为空,则返回-1。
  2. 如果队列不为空,使用取模运算(obj->back+obj->k)%(obj->k+1)来计算队尾元素的下标。这里obj->back表示队尾元素的下标,obj->k表示队列的容量减1。这样做是为了实现循环队列的封装。
  3. 返回队尾元素obj->a[(obj->back+obj->k)%(obj->k+1)],即对应下标位置上的元素值。
int myCircularQueueRear(MyCircularQueue* obj)//: 获取队尾元素。如果队列为空,返回 -1 。{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[(obj->back+obj->k)%(obj->k+1)];
}

8.释放循环队列的内存空间

首先,通过调用free(obj->a)来释放存储队列元素的数组的内存空间。obj->a指向数组的起始地址,free(obj->a)将释放该内存空间。

然后,通过调用free(obj)来释放存储循环队列结构体的内存空间。obj指向循环队列结构体的起始地址,free(obj)将释放该内存空间。

通过这两个free()函数的调用,可以确保循环队列所占用的所有内存空间都被释放,防止内存泄漏。

void myCircularQueueFree(MyCircularQueue* obj){free(obj->a);free(obj);
}

9.总的代码

typedef struct 
{int *a;int front;int back;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k)//构造器,设置队列长度为 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;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj)//检查循环队列是否为空。{return obj->front==obj->back;
}bool myCircularQueueIsFull(MyCircularQueue* obj)//检查循环队列是否已满。{return (obj->back+1)%(obj->k+1)==obj->front;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)//向循环队列插入一个元素。如果成功插入则返回真。{if(myCircularQueueIsFull(obj)){return false;}obj->a[obj->back]=value;obj->back++;obj->back%=(obj->k+1);//将 obj->back 除以 (obj->k+1) 的余数,然后将结果赋值给 obj->back。return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj)//从循环队列中删除一个元素。如果成功删除则返回真。{if(myCircularQueueIsEmpty(obj)){return false;}obj->front++;obj->front%=(obj->k+1);return true;}int myCircularQueueFront(MyCircularQueue* obj)//从队首获取元素。如果队列为空,返回 -1 。{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj)//: 获取队尾元素。如果队列为空,返回 -1 。{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[(obj->back+obj->k)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj){free(obj->a);free(obj);
}

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

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

相关文章

CSS-文字环绕浮动、行内块分页、三角强化妙用、伪元素选择器

文字环绕浮动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文字环绕浮动效果</title><s…

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …

Oracle ORA-28547:connection to server failed,probable Oracle Net admin error

使用Navicat连接oracle数据库时报ORA-28547错误 因为Navicat自带的oci.dll并不支持oracle11g&#xff0c;需要去官网下载支持的版本。 1.去oracle下载对应的oci.dll文件 下载地址&#xff1a;Oracle Instant Client Downloads 可以用 11.2.0.4 2. 复制刚下载下来的instant…

【智能算法】小龙虾优化算法(COA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;Jia等人受到自然界小龙虾社会行为启发&#xff0c;提出了小龙虾优化算法&#xff08;Crayfsh Optimization Algorithm, COA&#xff09;。 2.算法原理 2.1算法思想 COA基于小龙…

计算机网络-TCP连接建立阶段错误应对机制

错误现象 丢包 网络问题&#xff1a;网络不稳定可能导致丢包&#xff0c;例如信号弱或干扰强。带宽限制可能导致路由器或交换机丢弃包&#xff0c;尤其是在高流量时段。网络拥塞时&#xff0c;多个数据流竞争有限的资源&#xff0c;也可能导致丢包。缓冲区溢出&#xff1a;TC…

网络安全之代码签名证书申请

代码签名&#xff0c;作为一种数字安全机制&#xff0c;对于软件开发、分发及用户使用环节具有至关重要的意义。以下从六大方面阐述代码签名必不可少的重要性&#xff1a; 确保代码来源可信&#xff1a; 代码签名如同软件的“身份证”&#xff0c;通过数字证书对开发者身份进…

微信被拉黑删除的提示差异和检测方法

拉黑 被拉黑的提示是“消息已发出&#xff0c;但被对方拒收了”。 拉黑方能发消息且被拉黑方能接到&#xff0c;被拉黑的人无法发送成功&#xff0c;并灰色字提示。 删除 仅删除的时候&#xff0c;才能发送消息时不是提示拒收&#xff0c;可“发送朋友验证”添加&#xff0…

推荐两个可以直接使用的ChatGPT 开源应用

freegpt35, FreeAskInternet 无需注册账号即可使用。 FreeAskInternet https://github.com/nashsu/FreeAskInternet git clone https://github.com/nashsu/FreeAskInternet.git cd ./FreeAskInternet docker-compose up -dfreegpt35 https://github.com/missuo/FreeGPT35 …

Android开发环境部署Windows环境变量

JAVA_HOME C:\Program Files\Java\jdk-17 Path 里增加%JAVA_HOME%\bin; %JAVA_HOME%\jre\bin CLATHPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

头歌-机器学习 第11次实验 softmax回归

第1关&#xff1a;softmax回归原理 任务描述 本关任务&#xff1a;使用Python实现softmax函数。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.softmax回归原理&#xff0c;2.softmax函数。 softmax回归原理 与逻辑回归一样&#xff0c;softmax回归同样…

Python的re模块

re模块中的常用方法 Python中的正则表达式处理模块是re,re模块比较简单,包括以下几个方法: 查找 re.search():查找符合模式的字符,只返回第一个匹配到的,返回Match对象,匹配不到返回None re.match():和search一样,但要求必须从字符串开头匹配 re.findall():返回所有…

【星戈瑞】DBCO-NH2在生物成像技术中的应用

DBCO-NH2作为一种生物标记分子&#xff0c;在生物成像技术中发挥诸多应用作用。其点击化学反应特性使得它能够在生物体内进行特异的标记&#xff0c;从而为生物医学研究提供工具。 在生物成像技术中&#xff0c;DBCO-NH2常被用于标记生物分子&#xff0c;如蛋白质、核酸等。通…

Android 9.0 framework层实现app默认全屏显示

1.前言 在9.0的系统rom产品定制化开发中,在对于第三方app全屏显示的功能需求开发中,需要默认app全屏显示,针对这一个要求,就需要在系统启动app 的过程中,在绘制app阶段就设置全屏属性,接下来就实现这个功能 效果图如下: 2.framework层实现app默认全屏显示的核心类 fram…

Recommended Books:《Pride and Prejudice》

Recommended Books&#xff1a;《Pride and Prejudice》 Author Introduction: Jane Austen, born on December 16, 1775, in Steventon, England, is one of the most renowned English novelists of all time. Her works, including “Pride and Prejudice,” are known for…

【科研】搜索文献的网站

文章目录 paperswithcode【最新论文&#xff0c;代码】huggingface【大语言模型&#xff0c;最新论文】dblp【关键词搜索】arxiv【最新文章】semanticscholar【相关引用查询】connectedpapers【相关引用查询】github【工程&#xff0c;代码&#xff0c;论文开源代码】 paperswi…

mmdetection模型使用mmdeploy部署在windows上的c++部署流程【详细全面版】

0. 前置说明: 该文档适用于:已经使用mmdetection训练好了模型,并且完成了模型转换。要进行模型部署了。 1. 概述 MMDeploy 定义的模型部署流程,如下图所示: 模型转换【待撰写,敬请期待…】 主要功能是:把输入的模型格式,转换为目标设备的推理引擎所要求的模型格式…

andorid 矢量图fillColor设置无效

问题&#xff1a;andorid 矢量图fillColor设置无效 解决&#xff1a;去掉如下 android:tint一行

零基础考24上软考高级要备考多久呢?

对于零基础考软考高级的考生来说&#xff0c;备考时间是一个关键问题。 软考高级是国家信息技术行业的专业资格认证&#xff0c;对考生的能力要求较高&#xff0c;因此需要一定的备考时间来充分准备。那么&#xff0c;针对零基础考软考高级的考生&#xff0c;需要备考多久呢&a…

Ansys Zemax | 如何将光栅数据从Lumerical导入至OpticStudio(下)

附件下载 联系工作人员获取附件 本文介绍了一种使用Ansys Zemax OpticStudio和Lumerical RCWA在整个光学系统中精确仿真1D/2D光栅的静态工作流程。将首先简要介绍方法。然后解释有关如何建立系统的详细信息。 本篇内容将分为上下两部分&#xff0c;上部将首先简要介绍方法工作…

antdesign 1.7.8 vue2 table实现列合并

无分页&#xff0c;需要根据mac列进行列合并&#xff0c;最终效果如下所示&#xff1a; 核心实现如下&#xff1a; // 核心代码 const getRowspan (dataScroce, filed) > {let spanArr [];let position 0;dataScroce.forEach((item, index) > {if (index 0) {spanAr…