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 个潜在论文想法。每个论文的想法都包括一个介绍,简要概述了主题和研究目标…

明厨亮灶监控实施方案 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-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程。 要理解卷积神经网络中图像特征提取的全过程,我们可以将其比喻为人脑对视觉信息的处理过程。就像…

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 机构:约翰霍普…

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

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

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 …

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

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

Leetcode107. 二叉树的层序遍历 II

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 输入:root [3,9…

Java学习之序列化

1、引言 《手册》第 9 页 “OOP 规约” 部分有一段关于序列化的约定 1: 【强制】当序列化类新增属性时,请不要修改 serialVersionUID 字段,以避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请…

聊聊Http服务化改造实践

在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类,由于Dubbo拥有服务注册中心,并且起服务的命名非常规范,使用包名.类名.方法名进行描述。 而http调用通常都是使用httpclient等相关类库,这些在使用上并没有问题&am…

Matlab(画图进阶)

目录 大纲 1.特殊的Plots 1.1 loglog(双对数刻度图) ​1.3 plotyy(创建具有两个y轴的图形) 1.4yyaxis(创建具有两个y轴的图) 1.5 bar 3D条形图(bar3) 1.6 pie(饼图) 3D饼图 1.7 polar 2.Stairs And Ste阶梯图 3.Boxplot 箱型图和Error Bar误差条形图 3.1 boxplot 3.2 …

微信小程序开发教学系列(12)- 实战项目案例

十二、实战项目案例 本章将通过一个简单的实战项目案例来帮助读者巩固之前学习到的知识。我们将搭建一个名为“ToDoList”的微信小程序,实现一个简单的任务清单功能。 项目介绍 ToDoList是一个用于记录和管理任务的小程序。用户可以添加、编辑、完成和删除任务&a…

Docker部署RustDesk Server 设置开机自启

三、Docker安装 Docker官方和国内daocloud都提供了一键安装的脚本,使得Docker的安装更加便捷。 官方的一键安装方式: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 国内 daocloud一键安装命令: curl -sSL https://…

Docker学习

文章目录 我的docker环境替换apt软件包镜像源docker安装以apt包管理器安装docker卸载 以docker官方存储库安装卸载 添加某用户到docker组配置docker镜像 docker命令学习操作守护进程相关命令操作镜像相关命令查看镜像搜索镜像拉取镜像删除镜像 操作容器相关命令查看容器创建容器…

Deepin 图形化部署 Hadoop Single Node Cluster

Deepin 图形化部署 Hadoop Single Node Cluster 升级操作系统和软件 快捷键 ctrlaltt 打开控制台窗口 更新 apt 源 sudo apt update更新 系统和软件 sudo apt -y dist-upgrade升级后建议重启 开启ssh服务 打开资源管理器 进入系统盘 找到 etc 目录 在系统盘的 etc 目录上 右键…

【校招VIP】前端校招考点之UDP

考点介绍: UDP是非面向连接协议,使用udp协议通讯并不需要建立连接,它只负责把数据尽可能发送出去,并不可靠,在接收端,UDP把每个消息断放入队列中,接收端程序从队列中读取数据。 『前端校招考点…