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循环队列的销毁

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

那么本题我们就解决了。

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

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

相关文章

sql查询优化实际案例

1、第一步:sql优化 正对于海量数据的查询优化,且外键关联比较多的情况,通常情况是下sql层面的优化,有些时候是由于sql不合理的编写导致,如尽量少使用sql内查询等 如:避免使用 left join (select * form …

排序算法-----基数排序

目录 前言 基数排序 算法思想 ​编辑 算法示例 代码实现 1.队列queue.h 头文件 2.队列queue.c 源文件 3.主函数(radix_sort实现) 算法分析 前言 今天我想把前面未更新完的排序算法补充一下,也就是基数排序的一种,这是跟…

【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义

物理执行计划基本操作符 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏…

css三角,鼠标样式,溢出文字

目录 css三角 鼠标样式 例子:页码模块 溢出文字表示方式 margin负值运用 css三角强化 css三角 css三角中:line-height:0和font-size:0是防止兼容性的问题 jd {position: relative;width: 120px;height: 249px;background-…

斐讯K2结合Padavan实现锐捷认证破解方法

前言 众所周知,校园网在传统模式下是不能直接插路由使用的,但苦于校园网只能连接一台设备的烦恼,不得不“另辟蹊径”来寻求新的解决路径,这不,它来了,它来了,它带着希望走来了。 本文基于斐讯…

电子学会C/C++编程等级考试2021年09月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符统计 给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。输入 输入包含一行,一个字符串,长度不超过1000。输出 输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多…

前缀和——238. 除自身以外数组的乘积

文章目录 🍷1. 题目🍸2. 算法原理🍥解法一:暴力求解🍥解法二:前缀和(积) 🍹3. 代码实现 🍷1. 题目 题目链接:238. 除自身以外数组的乘积 - 力扣&a…

34970A 数据采集 / 数据记录仪开关单元

34970A 数据采集 / 数据记录仪开关单元 产品综述: Keysight 34970A 数据采集/数据记录仪开关单元由一个 3 插槽主机和一个内置的 6 1/2 位数字万用表组成。每个通道可以单独配置,以测量 11 种不同功能之一,这样既不会增加成本,也…

ubuntu挂载硬盘方法

1.关闭服务器加上新硬盘 2.启动服务器,以root用户登录 3.查看硬盘信息 fdisk -l4.格式化分区 找到需要分区的目录,并记录分区的uuid,用于后面修改/etc/fstab永久挂载配置文件 mkfs.ext4 /dev/nvme0n1 mkfs.ext4 /dev/nvme1n1 Filesystem UUID: a1c…

zookeeper 单机伪集群搭建简单记录

1、官方下载加压后,根目录下新建data和log目录,然后分别拷贝两份,分别放到D盘,E盘,F盘 2、data目录下面新建myid文件,文件内容分别为1,2,3.注意文件没有后缀,不能是txt文…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-4:内核控制与时间管理函数)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。 注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

怎样禁止邮件发送涉密信息

数字化时代,电子邮件已成为人们生活和工作中不可或缺的通讯工具。然而,随着互联网的普及,涉密信息的泄露风险也随之增加。为了保护敏感数据,禁止邮件发送涉密信息显得尤为重要。以下是一些建议,帮助你实现这一目标。 1…