LeetCode OJ循环队列(C语言)

1.题目的初步分析

我们分析上述题目的时候会发现题目非常的长,不好整理思路,我这里可以大致的将本题的几个核心点说出来:

1.队列的思路

循环队列说来说去不还是队列嘛,那么队列的基本操作增删查改、以及队列的基本结构肯定都是不能变的,我们知道队列的逻辑结构就是先进先出,而在C语言中,我们要实现队列可以采用两种方法,一种是链表,一种是顺序表,本题我们采用顺序表。

2.循环的实现

本题我们既然采用顺序表的结构来实现这个循环队列,那么我们就必须想一种方法来让它实现逻辑上的循环,这里可以提供一个思路,多开辟一块空间,队头指针指向队列首元素,队尾指针指向队尾元素的下一个空间;

比如上诉图,假设题目要求k为3,那么我们就开四块空间,为什么我们一定要多开一个空间呢?这是为了我们应对队列里只有0个元素或满元素的时候,倘若我们rear指向的是最后一个元素,那么我们0个元素和满元素就没有办法判断了,因为这两种情况front都等于n。

2.具体实现

2.1结构体里的结构

arr里面就是我们的元素了,k代表有k个元素,front就是首元素的下标,rear就是尾元素的下一个空间的下标。

2.2创建结构体

创建的步骤顺序表类似,注意这里要返回一个结构体类型类型的指针,所以我们就创建一个结构体指针的变量,创建完后就该给结构体里的arr数组开辟空间了,注意我们这里是开辟k+1个空间。然后就是把k赋值给结构体里的k,把front和rear都初始化为0,再返回这个指针变量就可以了。

2.3判空

注意,原本题目中的判空是在下面的位置,但我们把它提到前面来是因为在实现其它接口的时候判空和判满能给我们很大的帮助,所以我们待会也要把判满的接口提到上面来。

判空的实现非常简单,只需要判断rear和front是否相等就可以了,因为rear指向的是尾元素的下一个,所以逻辑上如果满的话,rear会呆在尾元素和头元素之间的空空间上,这也就说明了只有0个元素这种情况会使front等于rear。

2.4判满

为什么要这样来判满呢?因为逻辑上来说,既然是一个循环,那么满元素的时候rear就会在front的前面一个,但物理结构上我们实现的方式就是%,

比如说这种情况,k为3,rear也是3,,3%3=0,0=front,这样就达到判满的效果,那么为什么我们要加1呢,这是因为倘若我们的rear为0,那么0%任何数都是0,为了避免这种情况,我们才在两边都加上1。

2.5插入

插入操作我们先判满,如果队列满了我们就返回假,如果队列不为满,我们就赋值,赋完之后我们就给rear加上1,因为我们rear指向的是尾元素的下一个,但是不要忘记了,rear可能会超出范围,所以我们可以取余,倘若这一次加1操作超出了范围,我们就%(k+1),还是上面那幅图,倘若rear为四,k+1也为4,因为,下标本来就比元素个数少1嘛,所以这样操作之后,我们就让rear重新回到了0的位置,也就构成了物理意义上的循环,然后我们还要返回真。

注意,接口是有独立性的,我们只有知道在一个接口里我们需要针对什么,我们的思路才不容易混,比如本接口我们增加元素针对的是rear这个元素,就要考虑rear的情景,不需要考虑front的,只需要做好本职工作就行。

2.6删除

删除我们得先判空,如果为空就没必要删,直接返回假,如果有元素,那么我们直接让front++就行了,注意我们之前说过了,这是一个队列,那么我们的性质肯定要跟队列一样,出队列就是从队首出嘛,front++之后不要忘记front也可能会出界,所以我们同样进行取余操作,这个操作在上一个接口已经讲过了,我们这里就不再赘述了,删除成功返回真就可以了。

2.7获取队首元素

这个操作就非常简单,还是先判空,如果没有元素直接返回-1,如果有元素,就返回下标为front的元素就可以了。

2.8获取队尾元素

这个也是一样的,还是先判空,如果没有元素直接返回-1,如果有元素,就返回下标为rear的元素就可以了。

2.9循环队列的销毁

销毁操作我们直接把所有开辟的空间释放掉,所有值初始化就行了。

那么本题我们就解决了。

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

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

相关文章

JSP JSTL引入依赖并演示基础使用

然后 我们来讲 JSTL Java server pages standarded tag library 简称 JSTL 这是 一个 JSP的标准标签库 JSP标准标签的集合 封装了JSP中的通用核心功能 根据JSTL类库提供的标签 可以将他分为5个类 1 核心标签 2 格式化标签 3 SQL标签 4 XML标签 5 函数标签 这边 我们主要将 核…

超越噪音,让音乐重获新生:iZotope RX 10音频降噪修复软件

在音乐制作或者音频处理的过程中,噪音往往是一个让人头痛的问题。无论是环境噪音,还是设备产生的噪音,都会对音频质量产生重大影响。而现在,我们有了iZotope RX 10,这款专业的音频降噪修复软件,可以将你从噪…

全面预算管理,帮助企业财务团队冲破市场挑战

在实现企业财务发展的必经之路上,大多数财务专业人士会通过实施全面预算管理策略,为部门乃至整个组织建立一个用于数据管理和预测分析的财务模型,旨在影响和监控业务决策和变化趋势。全面预算管理通常包括历史数据分析和关于未来走向更详细的…

python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny)

python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny) 这次实验,我们分别使用opencv 的 sobel算子、沙尔算子、拉普拉斯算子三种算子取进行边缘检测,然后后面又使用了Canny算法进行边缘检测。 直接看代码,代…

武汉教育E卡通学生证照片尺寸要求及证件照集中采集方法

”武汉教育E卡通“电子学生证旨在数字化中小学生身份,提供通用的教育卡,实现身份认证的电子化、权威化和集成化。校内一卡通系统包括刷卡考勤、电子班牌、图书借阅等,全面记录学生在校业务。同时,采集社会通行、实践活动等数据&am…

Ubuntu开机显示No bootable devices found

Ubuntu开机报错,显示显示No bootable devices found,如下图所示: 解决方案如下: 1. F2进入BIOS (1) 重启开启,按F2进入BIOS系统。 (2) 进入Boot Sequence,目前系统选择了UEFI,而Legacy选项为…

计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载

计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,象如…

一起学docker系列之八使用 Docker 安装配置 MySQL

目录 前言步骤 1:拉取 MySQL 镜像步骤 2:运行 MySQL 容器步骤 3:检查容器状态步骤 4:进入 MySQL 容器步骤 5:配置 MySQL 字符编码步骤 6:重启 MySQL 容器步骤 7:测试字符编码步骤 8:…

2023 年 认证杯 小美赛 ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 cs数模团队在认证杯 小美赛前为大家提供了许多资料的内容呀&am…

GEE:通过将 Landsat 5、7、8、9 的 C02 数据集合并起来,构建 NDVI 长时间序列

作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)平台上,将 Landsat-5、Landsat-7、Landsat-8 和 Landsat-9 的数据合成为一个影像集合,并生成 NDVI(归一化植被指数)的时间序列的代码。 代码封装成了函数,方便调用,结果如下图所示, 在实际应用中,可能…

【Ambari】HDFS基于Ambari的常规运维

🦄 个人主页——🎐开着拖拉机回家_大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁&#x1f…

如何找出excel中两列数据中不同的值(IF函数的用法)

第一部分,举例: 例1: 如下图所示,A列和B列是需要比较的数据,C列为对比规则:IF(A2B2,"是","否") 示例图 例2:给B列的成绩评等级 C列的规则: IF(B2>85,&qu…

jvm优化之:OOM(out of memory)内存溢出

内存溢出 注意内存溢出不是内存泄漏!!这里主要是介绍如何用jdk自带的jmap工具导出进程堆空间快照。内存溢出: Out Of Memory,是指申请的堆内存空间不够用了,比如:你申请了10M空间,但是你要放12M…

Maven项目下详细的SSM整合流程

文章目录 🎉SSM整合流程一、两个容器整合✨ 1、先准备好数据库config.properties连接、mybatis-config.xml🎊 2、容器一:优先配置spring.xml文件🎊 3、容器二:配置springMVC.xml文件🎊 4、Tomcat整合spring…

图论——二部图及其算法

什么是二部图 二部图的判定 例子1 任选一个节点染成红色 红色的邻居染成蓝色 蓝色邻居染成红色 例子2 这个不是二部图 无权二部图的最大匹配

【腾讯云云上实验室-向量数据库】用向量数据库——实现高效文本检索功能

文章目录 前言Tencent Cloud VectorDB 简介Tencent Cloud VectorDB 使用实战申请腾讯云向量数据库腾讯云向量数据库使用步骤腾讯云向量数据库实现文本检索 结论和建议 前言 想必各位开发者一定使用过关系型数据库MySQL去存储我们的项目的数据,也有部分人使用过非关…

Python 自动化用处太大了!|python自动整理文件,一键完成!

随着时代的发展及人工智能的到来,Python 自动化办公能力几乎已成为每个岗位的必备技能! 而且到处可见的抖音、朋友圈铺天盖地宣传 Python 可以轻松达到办公自动化,并且学习没门槛,是真的吗? 我很负责的告诉大家&#…

使用 Python 和 NLTK 进行文本摘要

一、说明 文本摘要是一种自然语言处理技术,允许用户将大量文本总结为小块,而不会丢失任何重要信息。本文介绍NLP中使用Gensim和Sumy实现文本摘要的步骤。 二、为什么要总结文本? 互联网包含大量信息,而且每秒都在增加。文本摘要可…

BART - 磁共振重建库 linux系统安装 MATLAB 使用

本文主要介绍如何在linux系统中安装伯克利大学的磁共振重建库BART 和在matlab中的配置使用。 安装必要的库 (linux 命令行) $ sudo apt-get install make gcc libfftw3-dev liblapacke-dev libpng-dev libopenblas-dev 下载编译BART 文件 (官网链接:BART Toolbox) 命令行下…

RPC和HTTP的区别

目录 1、RPC是什么 1.1 概念 1.2 RPC的组成部分 1.3 常见的 RPC 技术和框架 1.4 RPC的工作流程 2、HTTP是什么 2.1 概念 2.2 HTTP的消息格式 2.3 HTTP响应状态码有哪些 3、⭐RPC和HTTP的区别 小结 1、RPC是什么 1.1 概念 RPC(Remote Procedure Call&am…