【数据结构初阶第十二节】设计循环队列

news2025/2/21 23:09:47

云边有个稻草人-CSDN博客

必须有为成功付出代价的决心,然后想办法付出这个代价。

还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 

目录

1.【题目】

2.实现循环队列推荐用数组,Why?

3.Q1:如何来判断队列是满的?

4.上代码!

5.【注意】


这题得多画图理解,不能空想,而且要结合我写代码中穿插的注释,这样就会好理解点

1.【题目】

2.实现循环队列推荐用数组,Why?

链表:如果像我们实现队列一样使用链表,定义两个指针,phead为头删除数据,ptail为尾插入数据,一开始每次插入数据都要申请节点,在队列满了之后,我们在队头删除数据,之后再要插入数据时我们就要判断要插入的节点数据是否为空,节点虽在,但内容数据被删掉了,此时需要status来存储节点的状态,记录空还是非空,比较麻烦。

数组:直接申请一块连续的空间,不需要像链表那样不断申请结点,也不需要指针来指来指去。定义两个变量,front 和 rear 分别指向队头和队尾,往 rear 指向的位置插入数据,之后 rear++,在 front 指向的位置删除数据,之后 front++。大体思路就是这样,操作比链表要简单。但是还有很多细节需要去补充调整,接下来跟着我的思路开始。

3.Q1:如何来判断队列是满的?

一开始 front 和 rear 都指向下标为0的位置,此时队列为空,每插入一次数据 rear 都要++指向下一个位置,因为是循环队列所以当队列插满的时候 rear 和 front 指向同一个位置 ,这时我们发现队列满时和队列为空时都是 rear == front ,那么该如何分辨队列满和为空时?

A1:如上图所示,我们多申请一个空间,一开始 front 和 rear 还是指向同一个位置(此时front 和 rear 相等,循环队列为空),假如我们要插入4(k)个数据为满,插入完最后一个数据时 rear 指向多申请的那个空间,此时队列满了,按照(rear+1)% (k+1)== front,为满,这样我们就可以分清何时为满何时为空了。

4.上代码!
//创建循环队列的结构
typedef struct {
    int* arr;
    int front;
    int rear;
    int capacity;
} MyCircularQueue;

//初始化循环队列
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* pst = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    pst->arr = (int*)malloc(sizeof(int)*(k+1));

    pst->front = pst->rear = 0;
    pst->capacity = k;
    return pst;
}

//判断队列是否为满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->rear+1) % (obj->capacity+1) == obj->front;
}

//向循环队列里面插入数据
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
    {
        return false;
    }
    obj->arr[obj->rear++] = value;
    //防止rear越界
    obj->rear %= obj->capacity+1;
    return true;
}

//判断循环队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front == obj->rear;
}

//删除元素
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    //队列不为空
    if(myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    obj->front++;
    //防止front越界
    obj->front %= obj->capacity+1;
    return true;
}

//取循环队列队头元素
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    return obj->arr[obj->front];
}

//取循环队列队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    //return obj->arr[obj->rear-1];
    //但是当rear == 0时,指向队头第一个位置时,rear-1 == -1,
    //此时出现错误,需要我们特殊处理一下
    int prev = obj->rear-1;
    if(prev == -1)
    {
        prev = obj->capacity;
    }
    return obj->arr[prev];
}

//销毁
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->arr);
    obj->arr = NULL;
    free(obj);
    obj = NULL;
}

/**
 * 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);
*/
5.【注意】
  1. 在取队尾元素的时候,是取 rear-1 指向的元素,若 rear-1 == -1,我们就需要特殊处理一下,具体详见代码。
  2. 在实现操作的时候我们要注意 front 和 rear 不能越界,obj->front %= obj->capacity,这样之后就从越界的位置变成下标为0的位置,如果没有越界,这样操作也不会改变 front 和 rear 的原始值。
  3. 我们申请的空间是比要存储数据的空间多一个。
  4. 我们定义一个 capacity 来保存要存储有效数据的个数。

这道题还是比较难的,我们需要多多思考细节思路+回顾敲代码。

完——

Look4You_Alberto Ciccarini、Beatrich_高音质在线试听_Look4You歌词|歌曲下载_酷狗音乐

(你真的会点开我精心分享给你的歌吗?)

至此结束!

我是云边有个稻草人

期待与你的下一次相遇。。。

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

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

相关文章

【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站…

【强化学习的数学原理】第10课-Actor-Critic方法-笔记

学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、最简单的Actor-Critic(QAC)二、Advantage Actor-Critic(A2C)三、重要性采样和…

scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL: CREATE DATABASE dbname; 人大金仓(Kingbase): 在人大金仓中,CREATE DATABASE 的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)

感谢您点开这篇文章:D,鼠鼠我是一个代码小白,下文是学习开源项目Open WebUI过程中的一点笔记记录,希望能帮助到你~ 本人菜鸟,持续成长,能力不足有疏漏的地方欢迎一起探讨指正,比心心&#xff5e…

什么是Grok-3?技术特点,场景,潜在问题与挑战

Grok-3 的技术特点与优势 1. 超大算力与训练规模 算力投入:Grok-3 使用了 20 万块英伟达 H100 GPU,分两个阶段训练(第一阶段 10 万 GPU 训练 144 天,第二阶段 20 万 GPU 训练 92 天),总计算量是前代 Grok-2 的 10 倍。这种规模远超同期其他项目(如印度的 1.8 万 GPU 公…

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言: 在现代Web应用和微服务架构中,用户身份验证和信息安全传输是核心问题。JSON Web Token(J…

鼎捷PLM深度集成DeepSeek,领跑智能研发新赛道

新年伊始,DeepSeek以其卓越的性能、高性价比和开源优势,掀起一股AI技术应用热潮,重塑各行各业的知识管理、知识应用模式。对制造业来说,首当其冲的就是研发管理变革,这也引发了企业的深度思考:在工业领域的…

VMware新建虚拟机

看看自己的电脑是什么内核,有几个处理器 再分配给虚拟机 镜像文件需要自己安装下载地方https://mirrors.aliyun.com/centos/?spma2c6h.13651104.d-2001.8.3fb1320cuI1jeS 然后就出现了 然后开启虚拟机,等待 等待之后如下,选择语言 等待一段时…

使用iOS个人声音与SoVITS训练个人AI语音(10分钟快速上手)

使用iOS个人声音与SoVITS训练个人AI语音(10分钟快速上手) 序言:最近在抖音上频繁看到曼波唱歌的视频和各种AI语音的搞笑短片,加上年后新购置的M2硬盘终于提供了足够的存储空间,让我有机会深入研究AI语音训练。24年年初…

【JavaEE进阶】Spring MVC(3)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 返回响应 返回静态页面 //RestController Controller RequestMapping("/response") public class ResponseController {RequestMapping("/returnHtmlPage&…

火语言RPA--Excel读取内容

【组件功能】:读取Excel内指定位置的内容或读取整篇Sheet页内容 配置预览 配置说明 读取位置 单元格:读取指定单元格中的内容。 行:读取指定行内容。 列:读取指定列内容。 区域:读取指定区域内容。 整篇sheet页&…

sass报错:[sass] Undefined variable. @import升级@use语法注意事项

今天创建vue3项目,迁移老项目代码,使用sass的时候发现import语法已经废弃,官方推荐使用use替换。 这里我踩了一个坑找半天的问题,原因是sass升级到1.85之后 定义变量前加上 - 就是表示变量私有,即使使用use导出 在新的…

重新出发的LLM本地部署——DeepSeek加持下的Ollama+OpenWebUI快速部署

DeepSeek 这真的是太惊艳了,发布出来的模型这么能打,在线的版本使用起来也是丝滑连招,感觉效果比起之前一直用智谱 chatglm4 更好用,想着本地化部署一下。 本来以为,会和之前在开发测试 transformers 的模型和代码一样…

动态网格图片展示中的自适应逻辑

在现代网页设计中,自适应逻辑不仅提升了用户体验,也显著提高了组件的灵活性。本文将探讨如何通过 动态计算每页图片数 和 窗口尺寸变化监听 来实现网格图片的自适应展示。以下内容不仅包含逻辑的核心,还展示了如何优雅地将这些逻辑与 Vue 框架…

Java基础——代理模式

代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 一、代理模式的主要作用 控制访问:通…

Django项目之订单管理part1

一.前言 我们前面把django的常用知识点给讲完了,现在我们开始项目部分,项目是一个订单管理系统,我们同时也会在项目之中也会讲一些前面没有用到的知识点。 项目大概流程如下: 核心的功能模块: 认证模块,用…

Electron通过ffi-napi调用dll导出接口

electron使用ffi-napi环境搭建 附打包好的ffi-napi可以直接放到项目目录下使用,避免以后麻烦 一、安装node.js Node.js官网:https://nodejs.org/zh-cn/download,选择LTS长期稳定版本即可 ![在这里插入图片描述](https://i-blog.csdnimg.c…

大数据SQL调优专题——Hive执行原理

引入 Apache Hive 是基于Hadoop的数据仓库工具,它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中,HQL默认转换成MapReduce程序运行到Yarn集群中,大大降低了非Java开发者数据分析的门槛,并且Hive提供命令…