【数据结构】队列的使用方法

队列(Queue)是另一种基本的线性数据结构,它允许在一端进行插入操作,而在另一端进行删除操作。队列的特点是先进先出(First In First Out, FIFO),即最先进入队列的元素最先被取出。

队列可以用数组来实现,也可以用链表来实现。用数组实现的队列称为顺序队列,用链表实现的队列称为链式队列。

顺序队列的特点是:

  • 存储空间连续。
  • 提前分配固定大小的存储空间,可能会造成空间浪费,或者空间不足时需要动态扩容。
  • 访问速度快,因为支持随机访问。

链式队列的特点是:

  • 存储空间不连续。
  • 动态分配空间,不会造成空间浪费,也不会出现空间不足的问题。
  • 访问速度相对较慢,因为不支持随机访问。

队列的应用非常广泛,包括:

  • 任务调度:在多任务操作系统中,队列用于管理等待执行的线程或进程。
  • 缓冲处理:在网络通信中,队列用于临时存储数据包,以平滑网络拥塞。
  • 异步数据传输:在消息队列中,生产者将消息放入队列,消费者从队列中取出消息,实现异步处理。
  • 事件管理:在图形用户界面中,队列用于管理用户操作产生的事件。

队列是一种简单但重要的数据结构,它在管理需要按照特定顺序处理的元素集合时非常有用。

以下我讲以下顺序队列的基本使用方法。 

1.循环队列结构体定义

#define N 10
typedef struct
{
        int data [ N ];
        int front ; // 队头,删除出队时用 front 当下标
        int rear ; // 队尾,插入入队时用 rear 当下标
} queue_t ;

循环队列操作

1. 创建一个空的队列 createEmptyQueue()

2. 判断队列是否为空,空返回值是 1 ,未空是 0 isEmptyQueue () p -> rear == p -> front
3. 判断队列是否为满 满返回值是 1 ,未满是 0 isFullQueue ()
4. 入队 inQueue ()
5. 出队 outQueue ()
6. 求队列的长度 getLengthQueue ()

2.创建一个空的队列

queue_t * createEmptyQueue ()
{
        queue_t * p = malloc ( sizeof ( queue_t ));
        if ( p == NULL )
        {
                printf ( "createEmptyQueue malloc failed!!\n" );
                return NULL ;
        }
        //只要 p->rear == p->front 就是空的队列 , 是几不重要
        //但是 p->rear p->front 的值 , 要在数组的下标范围内 0 ---- N-1
        p -> rear = p -> front = 3 ; // 3 赋值给 front, 在赋值给 rear, rear front 都得 3
        return p ;
}

3.判断队列是否为满 满返回1,未满返回0

int isFullQueue ( queue_t * p )
{
        //因为 p->rear == p->front 代表队列空 , 所以我们只能浪费一个存储位置来判断队列是否为满 ,
        //提前判断 p->reare+1 的位置是否 == p->front, 来判断是否是满队列
        return ( p -> rear + 1 ) % N == p -> front ? 1 : 0 ;
}

4.入队,在队列尾巴进行插入操作

int inQueue ( queue_t * p , int x )
{
        //0.容错判断
        if ( isFullQueue ( p ))
        {
                printf ( "isFullQueue!!\n" );
                return - 1 ;
        }
        //1.入队列 , rear 当做下标
        p -> a [ p -> rear ] = x ;
        //2.p->rear++,将入队的数据 x, 视为有效的元素
        p -> rear = ( p -> rear + 1 ) % N ; // %N 避免 p->rear+1 出现数组越界
        //p->rear = (p->rear+1) % N;此行代码等价于 p->rear++; p->rear =p->rear % N;
        return 0 ;
}

5.判断队列是否为空,空返回1, 未空返回0

int isEmptyQueue ( queue_t * p )
{
        return p -> rear == p -> front ? 1 : 0 ;
}

6. 出队列,在队列的头进行删除操作

int outQueue ( queue_t * p )
{
        //0.容错判断
        if ( isEmptyQueue ( p ))
        {
                printf ( "isEmptyQueue!!\n" );
        return - 1 ;
        }
        //出队 , front 当做数组的下标
        //1.将即将出队的数据 , 临时存储到变量 x
        //因为 front 永远指向队头的元素
        int x = p -> a [ p -> front ];
        //2.让出对的元素变为无效元素
        p -> front = ( p -> front + 1 ) % N ;
        //3.将出对元素的值返回
        return x ;
}

7.求队列的长度

int getLengthQueue ( queue_t * p )
{
        //按道理 ,rear 值肯定大于 front
        //方法一
        if ( p -> rear >= p -> front )
                return p -> rear - p -> front ;
        else // rear < front 按道理 rear 肯定大于 front 为什么 rear < front, 因为 %N, 所以 +N, 还原
                rear的值
                return ( p -> rear + N ) - p -> front ;
        //方法二
        //return (p->rear + N - p->front) % N;
}
结语
以上就是队列的基本使用,本次代码分享到此结束,后续还会分享数据结构知识。
最后的最后,还请大家点点赞,点点关注,谢谢大家!

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

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

相关文章

38. UE5 RPG 修改火球术的攻击方向以及按住Shift攻击

在前面&#xff0c;我们实现了火球术火球的制作&#xff0c;能够在释放火球术时&#xff0c;角色将播放释放技能动画&#xff0c;并实现了对火球的目标的服务器同步功能。 我们先回忆一下之前完成的内容。 在前面&#xff0c;我们先做了一个Actor&#xff0c;用于承载发射的火…

集成学习-Bagging与随机森林回归

reg_fRFR() reg_tDTR()#实例化决策树 cvKFold(n_splits5,shuffleTrue,random_state1412)#实例化验证方式 result_tcross_validate(reg_t#要进行交叉验证的评估器,X,y,cvcv,scoringneg_mean_squared_error#评估指标,return_train_scoreTrue#是否返回训练分数&#xff0c;后面这几…

高可用环境kafka消息未按顺序消费问题

目录 1、背景 2、问题排查 3、问题解决 1、背景 质检任务是异步执行&#xff0c;正常情况下任务状态扭转是 等待中》运行中》成功&#xff08;失败&#xff09;。在质量平台生成任务实例&#xff0c;此时状态是等待中&#xff0c;生成实例之后把具体的任务sql给到大数据平…

Git 原理及使用 (带动图演示)

文章目录 &#x1f308; Ⅰ Git 安装&#x1f319; 01. Linux - centos &#x1f308; Ⅱ Git 工作区、暂存区和版本库&#x1f319; 01. 认识工作区、暂存区和版本库&#x1f319; 02. 使用 Git 管理工作区的文件 &#x1f308; Ⅲ Git 基本操作&#x1f319; 01. 创建本地仓库…

动态Web项目讲解+Demo

web流程演示 请求路径 请求路径明确要请求的是哪个servlet 请求方式 servlet含有两种请求方式&#xff1a;doGet和doPost doGet&doPost 返回数据就是httpResponse&#xff0c;返回给success 参数 包含在request当中 成功 上述流程任何一步都没出问题&#xff0c;就会…

SpringBoot+layuimini实现左侧菜单动态展示

layuimini左侧菜单动态显示 首先我们看一下layuimini的原有菜单显示格式 {"homeInfo": {"title": "首页","href": "page/welcome-2.html?t2"},"logoInfo": {"title": "LAYUI MINI","…

Thinkphp5+mysql批量筛选varchar字段默认值为null的数据

荆轲刺秦王 sql server数据库转mysql之后,遇到: CREATE TABLE q_bk_date (daid int(11) NOT NULL AUTO_INCREMENT,partno varchar(200) CHARACTER SET utf8 NOT NULL DEFAULT ,Bdate date DEFAULT NULL,bkno varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT ,bvar varchar(…

ts中函数形状有几种定义方式

在TypeScript&#xff08;TS&#xff09;中&#xff0c;函数形状&#xff08;即函数的类型&#xff09;可以通过多种方式定义。以下是一些主要的定义方式&#xff1a; 类型别名定义函数形状&#xff1a; 使用 type 关键字为函数定义类型别名。 type MyFunction (a: number, …

cv2技术原理-图像旋转原理及手动实现

cv2技术原理-图像旋转原理及手动实现 1、图像旋转opencv实现2、cv2.getRotationMatrix2D函数解释3、数学原理推导旋转矩阵M4、手动计算旋转矩阵M5、旋转矩阵M的使用6、使用旋转矩阵M手动实现旋转功能 1、图像旋转opencv实现 图像旋转在对数据集数据增强&#xff08;主要是随机…

Java语言——封装

一.封装的定义 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问…

C++ //练习 12.31 如果用vector代替set保存行号,会有什么差别?哪种方法更好?为什么?

C Primer&#xff08;第5版&#xff09; 练习 12.31 练习 12.31 如果用vector代替set保存行号&#xff0c;会有什么差别&#xff1f;哪种方法更好&#xff1f;为什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 …

车机电源管理设计

电源电压 汽车正常电压是12 V&#xff0c;但整车厂会要求在9V~16V这个范围内所有零部件必须能够正常工作。 在启动时&#xff0c;电池电压会突降&#xff0c;特别天气寒冷的时候&#xff0c;电压可能会瞬间降到6V左右。 当汽车电池严重亏电而无法启动时&#xff0c;可能会用…

linux|将用户加入白名单

一 用root用户找到etc\sudoers文件 cd etc 二 修改etc\sudoers 文件的权限 默认是只读的 修改为可写的 chmod uw sudoers 三 打开 sudoers文件&#xff0c;在Allow root to run any commands anywhere 后面 添加一条&#xff08;把上面的一条内容复制下来 修改用户名即…

什么是程控电源?以及程控电源的工作原理与应用。

一、程控电源的简介&#xff1a; 程控电源是一种具有编程功能的电源设备&#xff0c;它可以通过外部控制来设定输出电压、电流的稳压、稳流或稳压/稳流模式&#xff0c;因此可以进行电压、电流、相位、频率、功率等参数的试验和检定。一些具体的产品特性包括微机控制、高精度、…

python实现假设检验-t检验

一. 什么是t检验 设总体 X ∼ N ( μ , δ 2 ) X\sim N(\mu,\delta^2) X∼N(μ,δ2)&#xff0c;其中 μ , δ 2 \mu, \delta^2 μ,δ2未知&#xff0c;统计量 t X ‾ − μ S / n t \frac{\overline{X} - \mu}{S/\sqrt{n}} tS/n ​X−μ​服从标准正太分布&#xff0c;可以…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

电商平台数据有哪些?如何进行电商平台数据分析?(内附模板及工具)

在电商日常的贩卖工作中会产生大量的数据&#xff0c;如果你还不知道如何利用这些宝贵的数据指导未来的销售策略、增长销售额的话&#xff0c;就和我一起看下去吧&#xff01;电商数据采集API接口包含哪些数据&#xff1f; 电商平台数据可以大致分为以下几个组成部分&#xff…

C#:直接调用 OpenFileDialog

C# 直接调用 OpenFileDialog&#xff0c;打开文件夹&#xff0c;选择视频文件&#xff0c;并播放。 编写 openvideo.cs 如下 // open a video file using System; using System.Diagnostics; using System.Windows.Forms;public class OpenVideoFile {[STAThread]public st…

Java中的封装

package day32; ​ public class Person {private String name;private int age; ​public String getName() {return name;} ​public void setName(String name) {this.name name;} ​public int getAge() {return age;} ​public void setAge(int age) {if (age>120 || …

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道&#xff0c;以收集、分析和利用客户数据&#xff0c;优化营销活动&#xff0c;并提高营销效果。 数字资产是一种新型的资产类别&#xff0c;它们以电子数据的形式存在&#xff0c;可…