数据结构—循环队列

news2024/11/28 22:34:00

数据结构—循环队列

  • 循环队列
  • 设计循环队列
    • 结构体的创建
    • 循环队列的初始化
    • 判空
    • 判满
    • 插入(尾插)
    • 出队列(头删)
    • 取队头元素
    • 取队尾元素
    • 空间的销毁

循环队列

一般在操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。
在这里插入图片描述
为了能使下标Qrear = Qfront来区别队空还是队满,我们常常认为以下左图为队空,右图为队满的情况。a1到a7为7个有效数据,有效数据k个;左图初始空队列状态,我们认为Qrear=Qfront=0,右图此时满队列的状态,Qrear=7,Qfront=0 在这里插入图片描述

设计循环队列

结构体的创建

typedef struct {
    int*a;//用动态数组实现
    int front;//头的下标
    int rear;//尾的下标
    //所以front和rear的取值都是0~k
    int k;//队列长度,有效数据长度为k
} MyCircularQueue;

循环队列的初始化

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    if(NULL == obj)//动态开辟结构体指针(销毁空间时也需free)
    {
        perror("malloc obj faile\n");
        return NULL;
    }
    obj->front = obj ->rear = 0;//初始队列元素为空,头尾在一起下标都为0
    obj->a = (int*)malloc(sizeof(int)*(k+1));//动态数组开辟k+1个空间,因为实际队列长度要比有效数据长度多一个空间
    if(obj->a == NULL)
    {
        perror("malloc obj->a faile");
        return NULL;
    }
    obj->k= k;//队列有效数据长度
    return obj;
}

判空

因为这是循环队列,在经过不断的插入删除的过程中,rear和front会不断地变换位置,所以判空条件就是判断他俩是否相等而不是他俩是否都为0
在这里插入图片描述

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front == obj->rear;//若rear和front相等即为空
}

判满

判满条件只需要看(rear+1)%(k+1)==front就好了

//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->rear+1) % (obj->k+1) == obj->front;
}

插入(尾插)

在这里插入图片描述

boolmyCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //有插入就要判断空间问题,判断队列是否满了
    if(myCircularQueueIsFull(obj))
    {
        return false;//插入失败返回false
    }
    obj->a[obj->rear++] = value;
    obj->rear %= obj->k+1;//rear为下标取值范围为0~k,所以这里限制以下rear的取值范围
    return true;
}

出队列(头删)

删除要判断是否为空队列,空队列不可以删除;头删原理就是,自增front,同样在进行头删的时候,因为front的自增,在动态数组a[k]到a[0]之间的过渡也需要对front取值范围的限制。
在这里插入图片描述

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    //删除就要判空
    if(myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    ++obj->front;
    obj->front %= obj->k+1;
    return true;
}

取队头元素

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;//队列为空返回-1
    }
    return obj->a[obj->front];
}

取队尾元素

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;//队列为空返回-1
    }
    return obj->a[(obj->rear-1+obj->k+1) % (obj->k+1)];
}

空间的销毁


//空间的销毁
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    obj->a = NULL;//防止野指针形成
    free(obj);
    obj = NULL;
}

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

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

相关文章

Vulnhub-RIPPER: 1渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、rips的使用三、获取密码文件四、日志审查五、提权 一、前言 由于在做靶机的时候,涉及到的渗透思路是非常的广泛,所以在写文章的时候都是挑重点来写,尽量的不饶…

nodejs+vue+ElementUi宠物领养救助网站0w6wc

宠物领养救助平台采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的nodejs进行编写,使用了vue框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括:个人信息修改,对用户、宠物类别、宠物…

appsmith安装手记:5.Sql server数据库容器再安装(yml)

上次安装好了sql server容器,但是appsmith创建数据源出现连接错误: [2024-01-30 00:25:52,186] userEmailttapp.com, sessionIdb99a2476-5c35-4a71-9e8e-25c9c3292cfa, threadboundedElastic-38, requestIdea262c1d-722b-4176-aac7-4b062d7066b6 - Opera…

小白初探|神经网络与深度学习

一、学习背景 由于工作的原因,需要开展人工智能相关的研究,虽然不用参与实际研发,但在项目实施过程中发现,人工智能的项目和普通程序开发项目不一样,门槛比较高,没有相关基础没法搞清楚人力、财力如何投入&…

敏捷软件研发管理流程- scrum

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低,可帮助企业快速落地敏捷,提质增效、缩短周期、加速创新…

嵌入式学习第十六天

制作俄罗斯方块小游戏(一) 分析: printf函数高级用法 \033[:表示转义序列的开始 m:表示转义序列的结束 0:重置所有属性 1:设置粗体或高亮 30-37:设置字体色 30: 黑 31: 红 32:…

服务器未启动而端口进程仍在运行如何查看并杀死

首先登录服务器然后查看当前监听的端口: sudo netstat -tuln比如这里的8080,我们此时并未启动服务器,但是它却正在运行,这会导致服务器刚启动就秒挂。如果没有日志的话会让人有点疑惑,这种情况可能是之前运行了该进程…

系统架构设计师-21年-下午答案

系统架构设计师-21年-下午答案 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答,二、三、四、五题中任选两题作答 试题一 (25分) 说明 某公司拟开发一套机器学习应用开发平台,支持用户使用浏览器在线进行基于机器学习的智能应用开发…

rancher证书过期问题处理

问题 起初,打开rancher ui页面打不开,telnet rancher的服务端口也不通。查看rancher 控制节点,日志显示,X509:certificate has expired or is not ye valid。证书已过期 解决 现在网上大部分的解决方案都是针对的2…

迁移windows操作系统

最近有个朋友跟我说他电脑台卡了,我帮他大概看了下,归集原因磁盘还是机械硬盘,需要将他的电脑的磁盘的机械硬盘换一下,内存也比较小,4GB的,换一下,换成8GB的,本文只涉及到更换系统盘…

【MATLAB】PSO_BiLSTM神经网络回归预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO_BiLSTM神经网络回归预测算法是一种结合了粒子群优化(Particle Swarm Optimization,PSO)和双向长短期记忆网络(Bidirectional Long Shor…

CodeGeeX AI编程助手提升.NET开发工作效率

前言 2022年6月,随着GitHub Copliot正式面向大众发布。让许多开发者都感受到了AI辅助编程工具的魅力所在,Copilot实现了帮助开发者大大提高了编程开发效率,让程序员朝九晚五成为可能。Copilot近乎是完美的,但还是由于种种原因&am…

LeetCode:49. 字母异位词分组

49. 字母异位词分组 1)题目2)代码3)结果 1)题目 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs…

color - 让你的输出带点颜色

color color 是一个可以让你输出带颜色文本的库。 安装 go get github.com/fatih/color示例 输出到控制台 // 这会直接输出到控制台 color.Cyan("Prints text in cyan.")// 每个调用末尾会自动加上换行 color.Blue("Prints %s in blue.", "text&…

任务导向的扩散模型压缩;万物皆可成像;根据舞蹈生成音乐;LLM长上下文对齐;LLM KV缓存量化;通过运动场辅助扩散模型图像编辑

本文首发于公众号:机器感知 任务导向的扩散模型压缩;万物皆可成像;根据舞蹈生成音乐;LLM长上下文对齐;LLM KV缓存量化;通过运动场辅助扩散模型图像编辑 Task-Oriented Diffusion Model Compression As re…

Vmware 无法开启虚拟化解决方法

最近遇到了Vmware无法开启虚拟化的问题,已经解决,记录一下解决经过。 我遇到的情况是BIOS已经开启虚拟化,HV服务也停用了,但是Vmware仍然提示模块“VPMC”启动失败。网上的解决方案千篇一律,基本都是排查BIOS、停用Windows的虚拟化功能、停用HV主机服务、Vmware配置中关闭…

python pandas模块详解

python pandas模块详解 一:pandas简介二:pandas安装以及库的导入2.1 Pandas安装2.2 pandas模块的导入 三:pandas数据结构3.1 pandas Series结构3.1.1创建Series对象1)ndarray(数组)创建Series对象2&#xf…

静态时序分析:时序弧以及其时序敏感(单调性)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中,不管是组合逻辑单元(如与门、或门、与非门等)还是时序逻辑(D触发器等)在时序建模时…

Elasticsearch性能调优

背景 项目上是用 ES 做数据库,存储的告警数据,量级在千万级别左右。测试在压测之后,系统频繁出现告警记录查询报错,系统不可用。基于此排查分析项目上 Elasticsearch 的使用是否合理。 版本及硬件 环境:10.xx.xxx.x…

sectigo ip ssl证书有哪些

Sectigo是移交成立时间较久的CA认证机构,几十年来在全球颁发了各种各样的数字证书,例如,单域名SSL证书、多域名SSL证书、通配符SSL证书等域名SSL证书。Sectigo旗下也有一些不常见的数字证书,例如,代码签名证书、IP证书…