设计循环队列---力扣622

1、题目

1.1基础设置与讲解

循环队列,即固定长度的队列,可以想象成一个环形队列

就类似于这种队列,队尾指针后会有一个空位,用于控制判断队列为空还是为满;

typedef int MyDataType;typedef struct {MyDataType front;MyDataType rear;MyDataType* a;MyDataType capacity;
} MyCircularQueue;

首先将int更名为MyDataType,方便对数据类型的统一管理;

并定义了一个结构体MyCircularQueue,

结构体内的成员

    MyDataType front;-----用于表示队列头指针
    MyDataType rear;-----尾指针
    MyDataType* a;-----存储队列元素的数组
    MyDataType capacity;-----队列所占空间大小

1.2节点创建

MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* new = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));if (new == NULL){perror("malloc fail");exit(-1);}new->a = (int*)malloc(sizeof(int)*(k+1));new->front = new->rear = 0;new->capacity = k ;return new;
}

首先节点的创建必须有返回值,以供使用,这个返回值显而易见应该是MyCircularQueue*,因为返回的是一个结构体的存储。

先开辟一个大小为MyCircularQueue类型的空间,并且创建一个新结构体用于接收,对开皮的空间进行判定,如果开辟失败则返回perror,并结束进行,如果空间开辟成功,则将结构体内部成员进行初始化,防止出现野指针、空指针等问题。

其中capacity的大小为k,而

    new->a = (int*)malloc(sizeof(int)*(k+1));

此处的k是队列长度,而开辟空间的时候应该加一,因为使用a这个数组存储,而数组是从0开始编号,所以k+1;

1.3队列的满和空

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

第一个函数,判断队列是否为空,为空则返回true,如果不为空则返回false,当头指针与尾指针相同时,则代表队列此时为空,如下图;

第二个函数,判断队列是否为满,为满则返回true,如果不为满则返回false,

1.4入队列

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

首先保证队列不为满,为满则无法进行存储;队尾指针进行数组数据输入。

 obj->rear = (obj->rear) % (obj->capacity+1);

这行代码的作用是将 rear 限制在 0 到 obj->capacity(包含)之间,以确保其不超过队列的容量。

其中如果只是obj->capacity的话只能在0~capacity-1,所以需要obj->capacity+1;

这是因为循环队列是一个环形结构,在到达数组末尾时会绕回到数组的起始位置,因此需要用取模操作来实现这种循环。

1.5出队列

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)){return false;}obj->a[obj->front] = 0;obj->front++;obj->front = (obj->front) % (obj->capacity+1);return true;
}

1.6取头指针和尾指针的数据

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->capacity)%(obj->capacity+1)];
}

1.7对队列进行释放

void myCircularQueueFree(MyCircularQueue* obj) {while (obj->a[obj->front] != 0){obj->a[obj->front] = 0;obj->front++;obj->front = (obj->front) % (obj->capacity+1);}obj->capacity = 0;obj->front = obj->rear = NULL;free(obj->a);free(obj);
}

2、总结

  1. 选择合适的数据结构: 循环队列通常基于数组实现,因为数组能够提供 O(1) 的随机访问时间,这对于循环队列中常见的插入和删除操作至关重要。但也可以使用链表实现循环队列,尤其在需要动态扩展队列大小时,链表实现可能更灵活。

  2. 确定队列的容量: 循环队列的容量应该是队列数组的大小减去 1,这是因为需要一个额外的位置来区分队列的空和满状态。

  3. 定义队列的属性: 需要定义队列结构体,并在其中包含头指针、尾指针以及存储元素的数组等属性。头指针和尾指针用于指示队列的起始位置和结束位置,而数组用于存储队列中的元素。

  4. 实现基本操作: 循环队列通常需要实现以下基本操作:

    • 入队操作(enqueue):向队尾插入元素。
    • 出队操作(dequeue):从队首删除元素。
    • 判空操作(isEmpty):检查队列是否为空。
    • 判满操作(isFull):检查队列是否已满。
    • 获取队首元素(front):返回队首元素的值,但不删除它。
    • 获取队尾元素(rear):返回队尾元素的值,但不删除它。

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

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

相关文章

CTF-Misc学习笔记

这里写目录标题 Misc准备古典密码凯撒密码棋盘密码ADFGX密码培根密码栅栏密码摩斯密码猪圈密码键盘密码QWE编码ook编码BrainFUck密码aaencode密码jsfuckbase全家桶URL编码十六进制二进制 ascii码 2.图片隐写分析LSP 隐写实操图片修改宽高实操 零宽度字符隐写音频隐写分析与实操…

新项目来了,JDK 17和JDK 21 该如何选择?

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

anaconda创建虚拟环境并配置到JupyterNotebook

anaconda创建虚拟环境并配置到JupyterNotebook 一、查看当前环境二、创建虚拟环境三、配置JupyterNotebook内核一、查看当前环境 如上图所示,在开始菜单中扎到Anaconda Prompt(Anaconda)并打开。在命令行窗口中输入命令conda info -e或者conda env list查看已安装的虚拟环境,…

开放式耳机哪个品牌质量比较好?五大热门品牌PK推荐

作为一名热爱音乐的DJ爱好者,我深知一款适合DJ使用的开放式耳机应该具备哪些特点。最近,我深入评测了几款热门开放式耳机,从音质、舒适度、耐用性到混音功能等方面进行了全面评估。今天,我想为大家分享我的评测结果,希…

网易云音乐格式在线转换

应用分享:众所周知网易云下载的格式为 .NCM,只能在网易云音乐里播放。 今天提供在线转换为MP3格式 NCM TO MP3,无需安装,转换后就能在任意播放器使用。 使用地址: https://ncm.worthsee.com/ 网络研究观 数据泄露…

WannaMine4.0病毒应急处置

一、前言 某日,通过流量监测设备和EDR发现挖矿请求告警,并存在长期445端口扫描。 二、病毒排查 上机排查,发现该服务器存在WannaMine4.0病毒,通过网上文章了解,如果请求挖矿域名遭安全设备拦截,会导致挖矿…

618有哪些好物值得入手?618四款必囤好物清单分享!

对于钟情于科技新品和数码产品的朋友们而言,每次大型购物节都是一个值得把握的机会,而即将来临的618购物节,更是让众多数码爱好者满怀期待。在此,我细心挑选了几款数码商品,希望能为您的购物清单增添几分灵感。让我们一…

系统架构设计师【第18章】: 安全架构设计理论与实践 (核心总结)

文章目录 18.1 安全架构概述18.1.1 信息安全面临的威胁18.1.2 安全架构的定义和范围18.1.3 与信息安全相关的国内外标准及组织 18.2 安全模型18.2.1 状态机模型18.2.2 Bell-LaPadula模型18.2.3 Biba模型18.2.4 Clark-Wilson模型18.2.5 Chinese Wall模型 18.3 系统安…

OpenCv之简单的人脸识别项目(登录页面)

人脸识别 一、项目准备二、登录页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.运行脚本3.1定义识别脚本3.2定义提取脚本3.3定义标注脚本3.4定义人脸比对脚本3.5定义动态处理脚本3.6定义属性判断脚本 4.创建一个退出…

智汇云舟与芯瞳完成兼容适配,共建国产化生态体系

近日,智汇云舟的视频孪生系列产品和时空大数据系列产品已完成与芯瞳半导体技术(山东)有限公司GPU产品GB2062/GB2064/CQ2040/CQ2040 MXM/CQ2040 MD的相互兼容性测试认证。双方产品经过严格测试,已完成兼容适配,具备良好…

【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解

👈️上一篇:桥接模式 | 下一篇:享元模式👉️ 设计模式-专栏👈️ 目 录 外观模式(Facade Pattern)定义英文原文直译如何理解呢?字面理解代码实现中的理解生活案例:操作多功能料理机典型案例…

ARM32开发——串口输入

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求串口数据接收中断函数IDLE中断串口接收流程(了解)完整示例 需求 串口接收PC机发送的数据。 串口数据接…

html+CSS+js部分基础运用13

一、三级联动 效果如下图所示: 图1 三级联动 二、设计江苏福彩投注站彩票投注助手 编程实现江苏福彩投注站彩票投注助手,页面布局效果如图2所示。 图2福彩投注站彩票助手页面 功能要求如下: 单击“机选1注”、“机选5注”或“机选10注”…

QT入门知识回顾

1 QT简介 1.1 Qt模块: Qt Core模块: 是QT类库的核心,所有其他模块都依赖这个模块 Qt Gui模块: 提供GUI程序的基本功能 Qt Network模块:提供跨平台的网络功能 Qt Widgets模块:提供创建用户界面的功能 1.2Qt的signal/slot机制 任何一个类只要类体前部书写 Q_OBJ…

香港移民政策放开了,2024拿香港身份的8种方式,申请条件解读

​香港移民政策放开了,2024拿香港身份的8种方式! 都2024年了,香港身份还受欢迎吗? 当然受欢迎,我们从数据上就能看出来,去年有超过24万人通过各类人才引入计划申请来港,其中超过14万获批&…

静态网页实现-人脸识别-案例(web)

🤳人脸识别(web) 基于开源大模型,将人脸识别功能整合到网页中,提供用户友好的界面和强大的功能。 核心功能 人脸轮廓识别: 通过深度学习算法,精确识别人脸的轮廓,包括眼睛、鼻子、嘴巴等关键部…

在QML中调用 C++ 函数的方法(四)

文章目录 前言一、qml 和 c++ 交互的官方文档介绍二、QML 中调用 C++ 实现的函数的方法1. Exposing Attributes of C++ Types to QML1.1 暴露 Properties1.2 暴露 Methods(槽函数和Q_INVOKABLE 修饰的函数)1.3 暴露 Signals2. Defining QML Types from C++3. 代码实例3.1 创建一…

【OpenHarmony】ArkTS 语法基础 ③ ( @Component 自定义组件生命周期回调函数 | @Entry 页面生命周期回调函数 )

文章目录 一、ArkTS Component 自定义组件生命周期1、自定义组件生命周期2、aboutToAppear 函数执行时机和作用3、aboutToDisappear 函数执行时机和作用4、代码示例 二、ArkTS Entry 页面生命周期1、Entry 页面生命周期2、onBackPress 和 onPageHide 回调函数无关联 三、代码示…

文化若想挣钱,真的很可怕吗?

文化若想挣钱,真的很可怕吗? 近日,我看到受人尊敬的静思有我先生的一个音频作品《会挣钱,遇上有文化,这个地方很可怕》,把这个标题在网上搜一搜,在它下面就跟着有这样一篇文章--商人不可怕&…

vscode 1.85安装remote-ssh后左侧没有图标

vscode安装remote-ssh插件后左侧没有图标。 解决方法 想要左侧有图标,是另一个插件起作用:Remote Explorer 但是这个插件最新版需要1.87,可以switch to Pre-release version之后就能用了。 其实,最后再switch to Release Versio…