Leetcode刷题之设计循环队列(C语言版)

Leetcode刷题之设计循环队列(C语言版)

  • 一、题目描述
  • 二、题目示例
  • 三、题目解析
    • Ⅰ、typedef struct
    • Ⅱ、MyCircularQueue* myCircularQueueCreate(int k)
    • Ⅲ、bool myCircularQueueIsEmpty(MyCircularQueue* obj)
    • Ⅳ、bool myCircularQueueIsFull(MyCircularQueue* obj)
    • Ⅴ、bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
    • Ⅵ、bool myCircularQueueDeQueue(MyCircularQueue* obj)
    • Ⅶ、int myCircularQueueFront(MyCircularQueue* obj)
    • Ⅷ、int myCircularQueueRear(MyCircularQueue* obj)
    • Ⅸ、void myCircularQueueFree(MyCircularQueue* obj)
  • 四、完整代码:

622、设计循环队列

一、题目描述

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:

①、MyCircularQueue(k): 构造器,设置队列长度为 k 。
②、  Front: 从队首获取元素。如果队列为空,返回 -1 。
③、Rear: 获取队尾元素。如果队列为空,返回 -1 。
④、enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
⑤、deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
⑥、isEmpty(): 检查循环队列是否为空。
⑦、isFull(): 检查循环队列是否已满。

二、题目示例

在这里插入图片描述
在这里插入图片描述

三、题目解析

首先本题我们可以采用两种方法解决,分别是数组和链表。在此,我采用数组的方法为大家解决本道题。大家觉得,上图的环形队列,最多可以存放几个数据呢?我想答案应该是7个or8个。我们从下图不难发现判断循环队列是否为空,我们就可以看frontrear是否相等。

在这里插入图片描述
但是当我们存放8个数据的时候,结果表示如下图所示:
在这里插入图片描述
此时的frontrear也相等,所以无法判断此时的循环队列是为满还是为空的状态。当然我们也可以定义一个size来记录此时的循环队列所存放的数据个数。但是我认为我们可以设定存放7个数据时,循环队列已达到为满的状态。结果如下:
在这里插入图片描述
此时我们可以用rear+1=front来判断循环队列是否达到存满的状态。接下来我们便正式开始本题目的讲解:

Ⅰ、typedef struct

首先在匿名结构体中需要定义4个成员变量,分别是front,rear,*a和k。

typedef struct 
{int front;//前面的int rear;//后面的int k;//存放数据的个数int *a;//数组
} MyCircularQueue;

Ⅱ、MyCircularQueue* myCircularQueueCreate(int k)

这个接口主要是对于刚才的结构体进行初始化,首先利用malloc函数对obj开辟一定的空间。对obj开辟好空间之后,我们就可以对obj中的对象进行一定的初始化。这里需要注意的是我们为数组a开辟的空间是K+1个,因为我们需要利用rear+1=front来判断循环队列是否达到存满的状态。初始化的代码如下:

MyCircularQueue* myCircularQueueCreate(int k) //初始化及开辟空间
{MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a= (int*)malloc(sizeof(int)*(k+1));obj->front=obj->rear=0;obj->k=k;return obj;   
}

Ⅲ、bool myCircularQueueIsEmpty(MyCircularQueue* obj)

该接口的目的是判断循环队列是否处于空的状态,前文提到我们可以利用front是否等于rear来判断循环队列是否为空。代码如下:

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

Ⅳ、bool myCircularQueueIsFull(MyCircularQueue* obj)

前文提到我们可以用rear+1是否等于front来判断循环队列是否处于满的状态。但是这种方法也有一种弊端,那就是:
rear+1等于6时,会产生数组越界问题,所以我们可以采用取余的方法来避免这一问题,(rear+1)%(k+1)==front来判断数组是否存储数据已满。
在这里插入图片描述

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

Ⅴ、bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)

向循环队列插入一个元素。如果成功插入则返回真。,这个接口首先要想到的是如果队列已经满了,则不能继续插入,所以先判断是否已满,如果满了就返回false。
接下来便是插入元素,这里需要注意的是我们需要依旧采用取余数的方法让队列循环起来,即:rear = rear % (k + 1)

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

Ⅵ、bool myCircularQueueDeQueue(MyCircularQueue* obj)

从循环队列中删除一个元素。如果成功删除则返回真。这个接口首先要想到的是如果队列为空了,则不能继续删除,所以先判断是否为空,如果为空就返回false。接下来就是删除操作,删除操作很简单,就是让==front++==即可,但是需要注意的是应当取余数避免越界:front = front % (k + 1)

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

Ⅶ、int myCircularQueueFront(MyCircularQueue* obj)

从队首获取元素。如果队列为空,返回 -1 。这个接口比较简单容易实现

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

Ⅷ、int myCircularQueueRear(MyCircularQueue* obj)

获取队尾元素。如果队列为空,返回 -1 。这里需要注意的是,当处在下图所示的情况时,如果强行获取rear的前一个位置可能会产生数组越界问题。所以我们需要采用取余数的方式来解决:rear+k%=(k+1)
在这里插入图片描述

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

Ⅸ、void myCircularQueueFree(MyCircularQueue* obj)

free需要注意的是首先要释放数组申请的内存空间,其次才是obj申请的内存空间。

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

四、完整代码:

typedef struct 
{int front;int rear;int k;//存放数据的个数int *a;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) //初始化及开辟空间
{MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a= (int*)malloc(sizeof(int)*(k+1));obj->front=obj->rear=0;obj->k=k;return obj;   
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj){return obj->front==obj->rear;}bool myCircularQueueIsFull(MyCircularQueue* obj) 
{return (obj->rear+1)%(obj->k+1)==obj->front;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{if(myCircularQueueIsFull(obj)){return false;}obj->a[obj->rear]=value;obj->rear++;obj->rear%=(obj->k+1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return false;}obj->front++;obj->front%=(obj->k+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj)
{if(myCircularQueueIsEmpty(obj)){return -1;}    return obj->a[(obj->rear+obj->k)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}/*** Your MyCircularQueue struct will be instantiated and called as such:* MyCircularQueue* obj = myCircularQueueCreate(k);* bool param_1 = myCircularQueueEnQueue(obj, value);* bool param_2 = myCircularQueueDeQueue(obj);* int param_3 = myCircularQueueFront(obj);* int param_4 = myCircularQueueRear(obj);* bool param_5 = myCircularQueueIsEmpty(obj);* bool param_6 = myCircularQueueIsFull(obj);* myCircularQueueFree(obj);
*/

在这里插入图片描述

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

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

相关文章

P19 C++ 构造函数的成员初始化列表

目录 前言 01 如果不用成员列表如何初始化变量 02 成员列表初始化 03 为什么要使用成员列表初始化呢? 04 案例代码 前言 本期我们聊聊构造函数初始化列表。 你应该经常使用成员初始化列表,如果你不喜欢这种代码风格,建议你还是慢慢习惯吧…

立即修复计算机显示msvcp110.dll丢失问题!4个快速解决方法大揭秘

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“msvcp110.dll丢失”。这个错误通常会导致某些程序无法正常运行,给用户带来诸多不便。那么,当我们遇到这个问题时,应该如何进行修复呢?本文将…

搭建一个可以发送邮箱验证码的接口,内含前端处理 接口返回、请求处理

环境搭建 在node安装好的情况下(一般vue环境有的node也有 没有可以使用winr回车输入node -v 有版本号则已经安装好 找一个空文件夹作为此项目文件夹 点击上面的地址栏输入cmd回车 输入npm init -y 再输入npm install nodemailer安装发送邮件的插件 环境配置 使用v…

vue3中toRef创建一个ref对象

为源响应式对象上的某个属性创建一个 ref对象, 二者内部操作的是同一个数据值, 更新时二者是同步的 区别ref: 拷贝了一份新的数据值单独操作, 更新时相互不影响 应用: 当要将 某个prop 的 ref 传递给复合函数时&#xff0c;toRef 很有用 父组件代码: <template><…

关于easy-es的聚合问题-已解决

es实体类&#xff1a; public class ChemicalES {IndexId(type IdType.CUSTOMIZE)private Long id;HighLightIndexField(fieldType FieldType.TEXT, analyzer "ik_max_word")private String name;IndexField(fieldType FieldType.KEYWORD)private List<Stri…

nginx 配置跨域(小皮面板)

本地开发的时候&#xff0c;前端请求后端&#xff0c;后端不能用域名请求&#xff0c;只能用端口模式&#xff0c;在小皮面板的话就是如下配置&#xff1a; 我的测试项目部署&#xff1a; 前端&#xff1a;http://localhost:8082 后端&#xff1a;http://localhost:8081 前端…

二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空

一、目的 在HiveSQL的DWD层中&#xff0c;需要对原始数据进行去重在内的清洗&#xff0c;结果一开始其他数据类型的清洗工作都正常&#xff0c;直到碰到转向比数据。 一般的SQL查询有数据&#xff0c;但是加上group by以后就没数据&#xff1b; 一般的SQL查询有数据&#xf…

Python实现WOA智能鲸鱼优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

uniapp基础-教程之HBuilderX基础常识篇02

uniapp创建项目时属性多为vue后缀&#xff1b;其中每个文件中都包含了三段式结构分别是template&#xff1b;script&#xff1b;style形势&#xff0c;分别是前端显示的画面以及js和css样式。 template&#xff1a;说大白话就是给别人看的&#xff0c;我们打开页面就可以看到的…

oracle查询开始时间和结束时间之间的连续月份

SELECT TO_CHAR(ADD_MONTHS(TO_DATE(2023-01,YYYY-MM), ROWNUM - 1), YYYY-MM) AS fmonth FROM DUALCONNECT BY ROWNUM < CEIL(MONTHS_BETWEEN(TO_DATE(2023-11, YYYY-MM), TO_DATE(2023-01,YYYY-MM))1)

附录11-math.h的常见方法

stdlib.h是做数学计算的头文件 目录 1 数学知识 1.1 弧度值/π 角度值/180 1.2 双曲函数 2 math.h 2.1 反余弦值 acos() 2.2 反正弦值 asin() 2.3 反正切值 atan() 2.4 两个数的反正切值 atan2() 2.5 向上取整 ceil() 2.6 余弦值 cos() 2.7 双曲余弦 c…

应用在触摸式面板中的电容式触摸芯片

触摸屏又称为“触控屏”、“触控面板”&#xff0c;是一种可接收触头等输入讯号的感应式液晶显示装置&#xff1b;当接触了屏幕上的图形按钮时&#xff0c;屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置&#xff0c;可用以取代机械式的按钮面板&#xff0c;并借由…

【JavaEE初阶】 HTTP协议和使用Fiddler抓包

文章目录 &#x1f38d;HTTP协议是什么&#xff1f;&#x1f340;应用层协议&#xff08;HTTP&#xff09;存在的意义&#x1f384;HTTP 协议的工作过程&#x1f334;HTTP 协议格式&#x1f333;Fiddler抓包工具的使用&#x1f6a9;如何抓HTTPS的包&#xff1f; &#x1f38b;抓…

【力扣】189. 轮转数组

【力扣】189. 轮转数组 文章目录 【力扣】189. 轮转数组1. 题目介绍2. 解法2.1 方法一&#xff1a;不太正规&#xff0c;但是简单2.2 方法二&#xff1a;使用额外的数组2.3 方法三&#xff1a;环状替换2.4 方法四&#xff1a;数组翻转 3. Danger参考 1. 题目介绍 给定一个整数…

社区新零售:重塑零售业的全新模式

社区新零售&#xff1a;重塑零售业的全新模式 近年来&#xff0c;新零售业成为了研究的焦点&#xff0c;它是一种以互联网为基础的零售形式。新零售通过运用先进技术手段&#xff0c;如大数据和人工智能&#xff0c;对商品的生产、流通和销售过程进行升级改造&#xff0c;重新构…

【实验记录】论文阅读(杂七杂八)

1.基于视觉语义路标的智能手机室内定位与建图研究_高煜昕 p19 介绍了智能终端的数据集ADVIO数据集&#xff0c;使用iPhone采集&#xff0c;针对视觉和惯导联合开发&#xff0c;具有描述真是复杂场景以及高质量真值的优点。 p20 论证了vins-mono、vins-fusion和orb-slam3等主流…

Go GORM简介

GORM&#xff08;Go Object-Relational Mapping&#xff09;是一个用于Go语言的ORM库&#xff0c;它提供了一种简单、优雅的方式来操作数据库。GORM支持多种数据库&#xff0c;包括MySQL、PostgreSQL、SQLite和SQL Server。以下是GORM的一些主要特性 全功能ORM&#xff1a;GORM…

提升企业网络安全的得力助手——EventLog Analyzer网络日志管理

在当今数字化时代&#xff0c;企业的网络安全问题变得尤为重要。为了更好地应对日益增多的威胁和安全漏洞&#xff0c;企业需要一种高效的网络日志管理工具&#xff0c;EventLog Analyzer便是其中一款卓越的解决方案。 EventLog Analyzer EventLog Analyzer是一款综合性的网络…

C#通过NPOI 读、写Excel数据;合并单元格、简单样式修改;通过读取已有的Excel模板另存为文件

文章目录 1 需要引用的DLL2 调用示例3 工具类 1 需要引用的DLL 2 调用示例 public static void WriteExcel() {string templateFile "F:\12312\excel.xlsx"; // 文件必须存在string outFile "F:\12312\" DateTime.Now.ToString("yyyyMMddHHmmssff…