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

力扣经典题目之->设计循环队列 的超详细讲解与实现

一:题目

二:思路讲解

前提:

a:本文采取数组来实现队列去解决题目

b:开辟k+1个空间,front指向队首,rear指向队尾的后一个,rear这样会更好的判空和判满

以下根据pop和push感受满和空以及所有的边界的处理

1:初始状态

解释:当front == rear 即空 

2 :push 1 2 3 4

解释:此时就是满了,那再push一个5会怎样?

3:在满的情况push 5

解释:得到判满条件(rear+1)%(k+1)== front,当rear的下一个就是front的时候就代表满了

Q:为什么不直接rear+1 = front?

A:这只适用于rear在数组非末尾位置的时候,而上面的表达式均适用

4:pop 1 2

5:push5 6

解释:rear的边界处理:rear = (rear+1)%(k+1) 

6:在满的情况下 push 7

解释:这是rear在非末尾的位置的判满, (rear+1)%(k+1)== front同样适用

7:pop 3 4 5 6 得到空

解释:

1:可得只要rear和front相等,就是空

2:front的边界处理 :front =(front)%(k+1)

总结:

通过这几步我们可知,满和空的判断表达式 ,以及front和rear超过边界的处理表达式

满:(rear+1)%(k+1)== front(rear 的下一个是front就是满)

空:front == rear

rear超过边界:rear = (rear)%(k+1) 

front超过边界:front =(front)%(k+1)

边界处理就是(下标)取模(数组空间)

最后一个边界处理:取队尾数据

当rear下标为0 的时候,这时候取队尾,rear-1 会等于-1,所以需要处理

1:三目操作符 rear = rear==0?k:rear

2:取模:rear = (rear+k)%(k+1)

这两种方法都适用与所有的取队尾

三:代码展示及其解释

1:初始化

解释:定义我们需要的值

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

解释:malloc  k+1个整形的数组空间给a

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

解释:根据我们前文的判空表达式 

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

解释:根据我们前文的判满表达式 

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

解释:

先判满,满了,则无法插入,返回false

有空间,根据前文插入到下标为rear处,再rear要++

最后再通过rear的边界的处理的表达式处理rear 

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

解释: 

先判空,空了,则无法删除,返回false

能删,直接front++

最后再通过front的边界的处理的表达式处理front

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

解释:直接返回front处的数据

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

解释:通过的前文的取队尾的rear的处理表达式来取队尾 

1:三目操作符 rear = rear==0?k:rear

2:取模:rear = (rear+k)%(k+1)

我用的第二种方法

9: 销毁队列

解释:先free a ,再free obj 

 

 

 

 

 

 

 

 

http://www.lryc.cn/news/405379.html

相关文章:

  • 【数据结构】排序算法——Lesson2
  • Ubuntu编译ffmpeg并添加cmake工程
  • Vue.js[组件(Component)]
  • 基于微信小程序+SpringBoot+Vue的校园自助打印系统(带1w+文档)
  • qt设置过滤器
  • 线上环境服务器CPU飙升排查
  • unity文字||图片模糊
  • 香薰学习笔记
  • iOS ------ weak的基本原理
  • 实时更新UI界面
  • 为什么Spring不推荐@Autowired用于字段注入
  • 【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动
  • 基于MobileNetv2的垃圾分类函数式自动微分-昇思25天打卡
  • STM32CubeIDE(CAN)
  • GO Channel使用详解(各种场景下的最佳实践)
  • SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战
  • picker 构建记录
  • Docker部署kafka,Docker所在宿主机以外主机访问
  • 控制欲过强的Linux小进程
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • Docker Desktop安装
  • 《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记
  • vscode调试nextjs前端后端程序、nextjs api接口
  • 《SeTformer Is What You Need for Vision and Language》
  • [保姆级教程]uniapp安装使用uViewUI教程
  • 网络安全法规对企业做等保有哪些具体规定?
  • Java开发中超好用Orika属性映射工具
  • qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)
  • 【qt】VS中如何配置Qt环境
  • 对于相同网段的IP,部分无法ping通问题