设计循环队列(C语言)怎会如此简单!!!

news2024/9/23 9:36:48

目录

  • 题目
    • 题目分析
  • 解答
    • 结构体
    • 初始化
    • 判空
    • 判满
    • 插入
    • 删除
    • 去队头数据
    • 取队尾数据
    • 队列的销毁

题目

链接: 题目

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

MyCircularQueue(k): 构造器,设置队列长度为 k 。

Front: 从队首获取元素。如果队列为空,返回 -1 。

Rear: 获取队尾元素。如果队列为空,返回 -1 。

enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。

deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。

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

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

题目分析

设计循环队列,我们可以使用 数组,也可以使用 链表(双向链表和单链表),这里我们讲的方法是使用数组的形式。
我们假设数组的大小为k, head和tail指向数组的头和尾, head是指向数组第一个元素,而tail是指向数组当前元素的下一个元素。
在这里插入图片描述
我们先入三个数据(1,2,3);
在这里插入图片描述
但是,我们并不能区分满和空的情况,因为如果是空的情况,则head=tail,但是如果是满的情况,也是head==tali。这里我们有两种方法来解决这个问题,
1. 在结构体中增加一个size的变量
2.多开一个空间

这里我们使用的方法是多开一个空间,如果有小伙伴对增加一个size变量更感兴趣,可以去尝试一下。
在这里插入图片描述
在这里插入图片描述
如果为空,则head=tail
如果为满,则tail+1=head

解答

结构体

先创建一个循环队列的结构体

typedef struct {
    int *a;//数组
    int head;//头
    int tail;//尾
    int k;//数组大小,你也可以在这里增加一个size变量,用于判空和判满
} MyCircularQueue;

初始化

对循环队列的初始化

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue * obj = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));//先malloc一个循环队列的结构体
    obj->a = (int *)malloc(sizeof(int) * (k + 1));//再malloc一个数组,数组大小为k+1
    obj->head = 0;//对head和tail,k的初始化
    obj->tail = 0;
    obj->k = k;
    return obj;
}

判空

判断循环队列是否为空,如果头和尾相同,则为空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->head==obj->tail;
}

判满

判断循环队列是否为满,如果tail+1=head,则为空,但是tail+1 = k+1了,也就是说,tail超过了数组下标的范围了,怎么办? 我们可以使用判断来区分,也可以使用取模运算,如果tali+1小于k+1,取模则不会有什么影响,但是如果tali+1==k+1,取模之后,tail+1就会等于0,这样可以使得队列循环起来。

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

插入

循环队列的插入:


bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
    return false;//先判断队列是否为满,满了就不能插入了
    obj->a[obj->tail] = value;
    obj->tail++;
    obj->tail %=(obj->k+1);//跟上一个函数接口类似,需要取模,才能够使队列循环起来,
    return true;
}

使队列循环起来的方式有很多,你可以使用取模来循环,你也可以使用判断来实现。

删除

循环队列的删除:


bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))//先判断是否为空,如果为空,则不能删除
    return false;
    obj->head++;
    obj->head %= (obj->k+1);//跟上一个函数接口类似,需要取模,才能够使队列循环起来
    return true;
}

去队头数据

Front: 从队首获取元素。如果队列为空,返回 -1 。

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

取队尾数据

Rear: 获取队尾元素。如果队列为空,返回 -1 。

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

队列的销毁

我们需要free两次,一次是对数组空间的释放,还有一个是对队列结构体的释放。

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

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

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

相关文章

AI Agent: Agent框架+7个实例

何谓Agent Agent 作为一种新兴的人工智能技术,正在受到越来越多的关注。要说清楚什么是 Agent,先得看看人工智能的本质是什么。 人工智能这个名称来自它试图通过计算机程序或机器来模拟、扩展和增强人类智能的 一些方面。在这个定义中,“人…

【QGIS入门实战精品教程】10.6:QGIS制作酒店分布热力图

相关阅读: ArcGIS实验教程——实验四十二:ArcGIS密度分析(核密度、点密度、线密度) 【ArcGIS微课1000例】0086:基于七普人口数据的人口密度分析与制图 ArcGIS实验教程——实验二十四:人口密度制图 文章目录 一、加载酒店分布数据二、热力分析一、加载酒店分布数据 订阅专…

LeetCode刷题之HOT100之合并二叉树

2024/5/26 晴。是的,等下我要去长乐沙滩赶海哈哈,因为这几天数字峰会,地铁公交又免费啦。ok,今天做的是HOT100里面最后一道easy题目啦,明天就是要跨越一个难度啦!做题吧 1、题目描述 2、逻辑分析 题目要求…

Python脚本必加代码:99%的程序员都忽视了这个细节!

文章目录 一、初识 if __name__ __main__二、__name__ 和 __main__ 是什么?三、实战讲解四、实际应用场景测试代码提高代码可重用性避免不必要的执行 五、深入理解和更多用法使用 argparse 解析命令行参数使用 unittest 进行单元测试使用 multiprocessing 创建子进…

任推邦:实力强劲的APP推广拉新平台,号称不扣量

任推邦简介 任推邦是国内数一数二的项目分发平台,也是一个不扣量的项目APP推广拉新平台,隶属于聚名科技集团股份有限公司。聚名科技成立时间在2012年,是安徽省老牌互联网企业,历经11年的飞速发展,聚名科技成功布局打造…

Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…

探秘NumPy的奥秘:元素级操作与广播机制

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、NumPy基础与元素级操作 元素级操作的引入 元素级操作详解 广播机制初探 二、NumPy矩…

PostgreSQL基础(三):PostgreSQL的基础操作

文章目录 PostgreSQL的基础操作 一、用户操作 二、权限操作 三、操作任务

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时,您应该可不想遇到措手不及的情况吧?相反,您需要在系统中使用一些可靠的数据恢复软件,但是全免费的数据恢复工具哪个好呢?别担心,本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

Linux 基本使用和 web 程序部署云端

目录 1.Linux发行版 2.Linux常用命令 ls pwd cd touch mkdir cat rm cp mv man vim grep ps netstat 绝对路径 vs 相对路径 使用 tab 键补全 使用 ctrl c 重新输入 粘贴与复制快捷键 3.Linux环境搭建 环境搭建方式 使用云服务器 4.搭建Java部署环境 …

CnosDB:深入理解时序数据质量函数

在CnosDB中,我们设计并实现了计算数据质量的多个指标,这些指标可以从多个维度评估时序数据的质量,对于时间戳列,我们考虑数据的缺失点、冗余点和延迟点。对于值列,我们考虑数据的异常值、范围、变化、速度和加速度。 C…

AI应用案例:影像报告智能辅助编辑系统

今天给大家介绍一个医疗行业的案例“影像报告智能辅助编辑系统”!该案例已经在某三甲医院落地,模型准确度超过80%。 该项目上线后,保守估计,能为每位医生的每一张报告至少省下1分钟时间和2分钟的精力,20位初级医生&…

大作业爬取手机数据,实现手机推荐系统以及朋友圈手机论坛

1、功能简介 (1)用户注册与用户登录 (2)手机搜索、手机比拼、手机个性化推荐 (3)点击搜索的手机图片会就用户行为,轮播展示用户行为,推荐点击次数靠前的手机 (4&#xf…

Day01-Web开发、介绍、HTML

一、什么是 Web ? Web:全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 <!-- 文档类型为HTML --> <!DOCTYPE html> <html lang"en"> <head><!-- 字符集 --><meta charset"U…

【Python001】python批量下载、插入与读取Oracle中图片数据(已更新)

1.熟悉、梳理、总结数据分析实战中的python、oracle研发知识体系 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景说明2.环境搭建2.1 参考链接2.2 `oracle`查询测试代码3.数据请求与插入3.1 `Oracle`建表语句3.2 `Python`代码实现3.3 效果示例4.问题链…

2024最新 Jenkins + Docker实战教程(二) - Jenkins相关配置

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

深入了解Nodejs模块机制

深入了解Nodejs模块机制 我们都知道Nodejs遵循的是CommonJS规范&#xff0c;当我们require(moduleA)时&#xff0c;模块是怎么通过名字或者路径获取到模块的呢&#xff1f;首先要聊一下模块引用、模块定义、模块标识三个概念。 1 CommonJS规范 1.1 模块引用 模块上下文提供…

操作符详解(上)(新手向)

操作符详解&#xff08;上&#xff09; 一&#xff0c;算术操作符&#xff08;双目操作符&#xff09;1:‘’,‘-’,‘*’2&#xff1a;‘/’&#xff0c;‘%’ 一&#xff0c;单目操作符1:‘’,‘-’2&#xff1a;‘!’3&#xff1a;‘&’4&#xff1a;‘*’5&#xff1a;…

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…

.NET 一款内部最新的免杀WebShell

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…