leetcode622-设计循环队列

 本题重点:

1. 选择合适的数据结构

2. 针对选择的数据结构判断“空”和“满”

这两点是不分先后次序的,在思考时应该被综合起来。事实上,无论我们选择链表还是数组,最终都能实现题中描述的“循环队列”的功能,只不过选择不同结构时,我们面临和需要解决的问题不同。

一、思路

1. 数组实现队列。定义变量 front 标识队头,变量 rear 标识队尾。

数组设计循环队列的好处:

1. 找队尾元素方便;使用链表实现时,需要找尾。

2. 循环实现方便,通过控制下标即可完成循环。

2. 初始时,front = rear = 0,每次插入一个元素,rear向后走一位。

3. 判断“空” 和 “满”。如果 front 和 rear 下标相同,队列为空,还是满?

4. 理解(rear + 1)% (k + 1)== front

若队列已满,则rear 的下一个位置为 front。

此外,每一次插入数据 或者 删除数据 后,都要进行取模操作

防止 front 和 rear 走出实际数组的范围,造成数组越界。

二、功能模块实现 

1. MyCircularQueue(k): 设置队列长度为 k

typedef struct {int* a; // 指向的空间用来存储元素int front;int rear;int k;
} MyCircularQueue;​
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->front = obj->rear = 0;obj->k = k;obj->a = (int*)malloc(sizeof(int) * (k + 1));// 多创建1个空位,// 该位置不用来存储元素,仅用于判断队列“空”和“满”return obj;
}

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

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->rear == obj->front)return true;elsereturn false;
}

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

bool myCircularQueueIsFull(MyCircularQueue* obj) {if((obj->rear + 1) % (obj->k + 1) == obj->front)return true;elsereturn false;
}

4. enQueue(value): 向循环队列插入一个元素。

如果成功插入则返回真。

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;else{obj->a[obj->rear] = value;obj->rear++;obj->rear %= obj->k + 1;return true;}
}

5. deQueue(): 从循环队列中删除一个元素。

如果成功删除则返回真。

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;else{obj->front++;obj->front %= obj->k + 1;return true;}
}

 6. Front: 从队首获取元素。

如果队列为空,返回 -1 。

int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->front];
}   

7. Rear: 获取队尾元素。

如果队列为空,返回 -1 。 

int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear + (obj->k + 1) - 1) % (obj->k + 1)];
}

8. QueueFree: 销毁循环队列

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

 

三、所有代码

typedef struct {int* a;int front;int rear;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->front = obj->rear = 0;obj->k = k;obj->a = (int*)malloc(sizeof(int) * (k + 1));return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->rear == obj->front)return true;elsereturn false;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {if((obj->rear + 1) % (obj->k + 1) == obj->front)return true;elsereturn false;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;else{obj->a[obj->rear] = value;obj->rear++;obj->rear %= obj->k + 1;return true;}
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;else{obj->front++;obj->front %= obj->k + 1;return true;}
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->front];
}   int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear + (obj->k + 1) - 1) % (obj->k + 1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

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

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

相关文章

vscode远程调试php

使用vscode远程调试php的方法 1.安装remote ssh插件 2.连接服务器 可以点击左下角的绿色按钮,或者ctrlshiftp打开命令框输入remote ssh应该也有。 3.在服务器端vscode安装php debug插件 4.安装xdebug xdebug是用来调试php的软件,原本和vscode没什么关…

iBooker 技术评论 20230831

一、轻资产项目的五类分类 轻资产项目不需要投资,但也不是所有人都做得了,取决于个人认知和能力水平限制。 就好比以前的各科题目,你也不是都能做吧? 我以前刷题的时候,喜欢把题目按照难易程度分五类。现在做项目和…

人工智能研究的未来:20 年机器学习和深度学习的论文创意!

“机器学习的美妙之处在于,它可以应用于你想要解决的任何问题,只要你能为计算机提供足够的例子。” 一、说明 该文章列出了 20 年机器学习和深度学习本科课程的 2023 个潜在论文想法。每个论文的想法都包括一个介绍,简要概述了主题和研究目标…

【Spring Security】使用 OncePerRequestFilter 过滤器校验登录过期、请求日志等操作

文章目录 前言OncePerRequestFilter 使用检查是否登录过期过滤器检查是否登录过期过滤器 SecurityConfiguration 配置 前言 OncePerRequestFilter 是一个过滤器,每个请求都会执行一次;一般开发中主要是做检查是否已登录、Token是否过期和授权等操作&…

明厨亮灶监控实施方案 opencv

明厨亮灶监控实施方案通过pythonopencv网络模型图像识别算法,一旦发现现场人员没有正确佩戴厨师帽或厨师服,及时发现明火离岗、不戴口罩、厨房抽烟、老鼠出没以及陌生人进入后厨等问题生成告警信息并进行提示。OpenCV是一个基于Apache2.0许可&#xff08…

【Ubuntu】解决ubuntu虚拟机和物理机之间复制粘贴问题(无需桌面工具)

解决Ubuntu虚拟机和物理机之间复制粘贴问题 第一步 先删除原来的vmware tools(如果有的话) sudo apt-get autoremove open-vm-tools第二步 安装软件包,一般都是用的desktop版本(如果是server换一下) sudo apt-get …

计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程。 要理解卷积神经网络中图像特征提取的全过程,我们可以将其比喻为人脑对视觉信息的处理过程。就像…

springboot中entity层、dto层、vo层通俗理解三者的区别

entity:这个类的属性是跟数据库字段一模一样的(驼峰命名),当我们使用MyBatis-Plus的时候经常用得到。 dto:用于后端接收前端返回的数据,一般是post请求,前端会给我们返回一个json对象&#xff…

js实现一行半文本的截取

最近遇到一个需求是要在第二行的中间截取文本,因为在后面得贴一个图标,所以这种情况用常规的css截取文本有点难处理。于是在上网查阅后发现了几个方法:第一种是用伪元素加定位,把.;11..盖在文字的上面;第二…

03_nodejd_npm install报错

npm install报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: 5kcrm11.0.0 npm ERR! Found: vue2.5.17 npm ERR! node_modules/vue npm ERR! vue"2.5.17" from the root project npm ERR! np…

FC-CLIP-卷积永存:开放词汇分割与单一冻结卷积CLIP

论文链接:https://arxiv.org/abs/2308.02487 Github:GitHub - bytedance/fc-clip: This repo contains the code for our paper Convolutions Die Hard: Open-Vocabulary Segmentation with Single Frozen Convolutional CLIP 机构:约翰霍普…

【ES6】JavaScript中Reflect

Reflect是JavaScript中的一个内建对象,它提供了一组方法,用于对对象和函数进行操作和检查。这些方法与内建对象的方法非常相似,但具有更高的灵活性。 以下是Reflect对象的一些常用方法: 1、Reflect.apply(target, thisArgument,…

基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台+后台,完美运行,有一万一千字论文。

基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台后台,完美运行,有一万一千字论文。 系统中的功能模块主要是实现管理员和员工的管理; 管理员:个人中心、普通员工…

【每日一题】1275. 找出井字棋的获胜者

1275. 找出井字棋的获胜者 - 力扣(LeetCode) A 和 B 在一个 3 x 3 的网格上玩井字棋。 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上。第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用…

PyQt和Qt的其他绑定(如PySide)相比有什么优势和劣势?

作为一个新手,你可能会对PyQt和Qt的其他绑定(如PySide)之间的优势和劣势感到困惑。没问题,这很正常。我们先来谈谈优势吧。 首先,PyQt是由C编写的,因此它具有强大的跨平台支持。这意味着无论你使用的是Win…

Orangepi 香橙派配置wifi网络

查看wifi 列表 sudo nmcli d wifi 断开wifi连接 sudo nmcli dev dis wlan0 查看设备情况 sudo nmcli d 连接wifi nmcli device wifi connect aair password 123456 删除wifi连接 nmcli con del wifiaaaa 重启网络: sudo service NetworkManager restart 或 su…

C++中的语法知识虚继承和虚基类

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类…

PQUEUE - Printer Queue

题目描述 The only printer in the computer science students union is experiencing an extremely heavy workload. Sometimes there are a hundred jobs in the printer queue and you may have to wait for hours to get a single page of output. Because some jobs are …

HTTP/1.1协议的状态码

2023年8月30日,周三下午 HTTP/1.1协议定义了一组状态码,用于表示请求的处理结果。 每个状态码都有特定的含义,它们以三位数字的形式出现在响应的状态行中。 下面是一些常见的HTTP/1.1协议的状态码及其含义: 1xx(信息…

【GoldenDict】win11牛津高阶英汉双解词典安装使用方法

【词典资源】 1(本文章使用的版本)牛津高阶(第10版 英汉双解) V11.8: https://pan.baidu.com/s/11272Cldde_2UttQkWS2MlQ 提取码:0p3j 2(另一版本)第十版 v13.2: ht…