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.mfbz.cn/a/196269.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

老师怎样处理校园欺凌

校园欺凌是一个让人痛心又不可忽视的问题。作为老师,该如何处理这种问题,既能够保护受欺凌的学生,又能够让施暴者得到应有的教训呢? 及时发现并介入 经常关注学生的动态,一旦发现有校园欺凌的苗头,就要及时…

如何轻松将 4K 转换为 1080p 高清视频

由于某些原因,你可能有一些 4K 视频,与1080p、1080i、720p、720i等高清视频相比,4K 视频具有更高的分辨率,可以给您带来更多的视觉和听觉享受。但是,播放4k 视频是不太容易的,因为超高清电视没有高清电视那…

医疗器械企业升级路:直连客户盘活存量,布局出海寻求增量

随着随着医疗各领域VBP(带量采购)的稳步推进以及医疗机构DRG/DIP(按疾病诊断相关分组/病种分值支付)的深化应用,降本增效和精细化管理已经成为医院管理者的头等大事。 这也在倒逼医疗器械厂商提升管理水平和营销效率。…

FFA 2023|字节跳动 7 项议题入选

Flink Forward 是由 Apache 官方授权的 Apache Flink 社区官方技术大会,作为最受 Apache Flink 社区开发者期盼的年度峰会之一,FFA 2023 将持续集结行业最佳实践以及 Flink 最新技术动态,是中国 Flink 开发者和使用者不可错过的的技术盛宴。 …

竞赛选题 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正

文章目录 0 简介1 思路简介1.1 车牌定位1.2 畸变校正 2 代码实现2.1 车牌定位2.1.1 通过颜色特征选定可疑区域2.1.2 寻找车牌外围轮廓2.1.3 车牌区域定位 2.2 畸变校正2.2.1 畸变后车牌顶点定位2.2.2 校正 7 最后 0 简介 🔥 优质竞赛项目系列,今天要分享…

视频文案怎么写,媒介盒子支招

近几年短视频成为风口,各行各业都想分一杯羹,但是一头热的你,是否知道短视频的相关文案怎么写呢?正所谓兵马未动,文案先行,一个合适的文案是上热门的秘密武器,今天媒介盒子就来和大家聊聊:视频…

概要设计检查单、需求规格说明检查单

1、概要设计检查表 2、需求规格说明书检查表 概要(结构)设计检查表 工程名称 业主单位 承建单位 检查依据 1、设计方案、投标文件;2、合同;3、信息系统相关技术标准及安全规范; 检查类目 检查内容 检查…

汽车电子 -- 车载ADAS之RCW(后碰撞预警系统)

相关法规文件: RCW: GB 4785-2019 汽车及挂车外部照明和光信号装置的安装规定 一、后方碰撞预警系统 RCW( Rear Collision Warning ) 参看:功能定义-后方碰撞预警 RCW 功能可以对自车行驶过程中对后方车辆进行监测&#xff0…

Tableau连接到mysql数据库,配置驱动

Tableau想要连接mysql数据库进行数据的可视化,但是没有ODBC驱动,看了几篇文章写的,不是很清楚,顺便写下自己的思路。 1、下载mysql对应的ODBC驱动 首先要知道自己mysql的版本,然后下载对应的ODBC驱动。 MySQL :: Dow…

colab notebook导出为PDF

目录 方法一:使用浏览器打印功能 方法二:使用nbconvert转换 方法三:在线转换 方法一:使用浏览器打印功能 一般快捷键是CTRLP 然后改变目标打印机为另存为PDF 这样就可以将notebook保存为PDF了 方法二:使用nbconver…

供应链攻击的类型和预防

供应链攻击是一种面向软件开发人员和供应商的新兴威胁,目标是通过感染合法应用分发恶意软件来访问源代码、构建过程或更新机制。 供应链攻击是威胁行为者通过利用软件供应链中的漏洞进入组织网络的一种网络攻击,供应链攻击的目标可以是软件开发过程中的…

虚幻学习笔记5—UI预设体制作

一、前言 本文使用的虚幻引擎5.3.2,在unity中有预设体的概念,可以将一个组合型的物体或UI制作成预设体,方便后续可以快速制作更多元的内容和复用。虚幻本身没有这个概念,但是要实现类似的效果其,故此我引用了这个概念。…

【密码学引论】Hash密码

第六章 Hash密码 md4、md5、sha系列、SM3 定义:将任意长度的消息映射成固定长度消息的函数功能:确保数据的真实性和完整性,主要用于认证和数字签名Hash函数的安全性:单向性、抗若碰撞性、抗强碰撞性生日攻击:对于生日…

这才是BI大数据分析工具的正确打开方式!

这两年经济下行给各行各业造成不小的发展困扰,为此企业积极自救,希望通过数字化降本增效,提高业绩水平。BI大数据分析工具就是企业数字化转型中常用到的一种商业智能BI工具,主要作用是缩短数据分析时间,提升企业数据分…

没有预装Edge浏览器的Windows系统安装Edge正式版的方法,离线安装和在线安装

一、在线安装 没有预装Edge浏览器的Windows系统安装Edge正式版的方法 二、离线安装 进入到下面这个目录 C:\Program Files (x86)

LFM信号分析

LFM信号 在时域中,理想线性调频信号持续时间为 T T T 秒,振幅为一常量,中心频率为 f c e n t e r f_{center} fcenter​ ,相位 θ ( t ) \theta(t) θ(t) 随时间按一定规律变化。当 f c e n t e r f_{center} fcenter​ 为0时…

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

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

Windows10免安装PostgreSQL

1. PostgreSQL简介2. 下载3. 安装环境4. 安装 4.1. 初始化数据库4.2. 启动数据库4.3. 注册服务4.3. 卸载服务 1. PostgreSQL简介 PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统,是以加州大学计算机系开发的 POSTGRES 4.2版本为基础的对象关…

我用C语言实现的文字跑马灯,简直是程序员的表白神器!

系列文章 Python百宝箱 C语言百宝箱 目录 系列文章 写在前面 C语言简介 EasyX简介 EasyX下载安装 文字跑马灯 写在后面 写在前面 教你用C语言实现文字跑马灯效果,简直是C语言表白神器! 环境:C语言/C 软件:Visual Studi…

丽晶酒店及度假村打造绮丽之境“美食实验室”中国市场首秀

于重庆丽晶酒店以艺术与美食的碰撞演绎“对比之美”,感官之华 2023年11月28日,中国上海 ——基于对当下消费趋势的敏锐洞察,洲际酒店集团旗下奢华品牌丽晶酒店及度假村近年来不断焕新,以崭新形象缔造现代奢华的旅居体验。作为丽晶…