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

队列(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.mfbz.cn/a/573490.html

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

相关文章

嵌入式linux学习之arm开发板移植ssh

1.下载源码 &#xff08;1&#xff09;zlib 下载网址&#xff1a;http://www.zlib.net/fossils/ 教程中版本选择的是: zlib-1.2.11.tar.gz &#xff08;2&#xff09;openssl下载网址&#xff1a;https://www.openssl.org/source/mirror.html 教程中版本选择的是: openssl-1.1…

【Qt】.ui文件转.h文件

1、打开qt命令行 2、转换 uic -o ui.h mainwindow.ui

Linux c++ onvif客户端开发(9):GetProfiles

本文是Linux c onvif客户端开发系列文章之一&#xff1a; Linux c onvif客户端开发(1): 根据wsdl生成cpp源文件Linux c onvif客户端开发(2): 获取摄像头H264/H265 RTSP地址Linux c onvif客户端开发(3): 扫描设备Linux c onvif客户端开发(4): 扫描某个设备是否支持onvifLinux c…

js基础知识(2)

一、事件的含义 JavaScript事件是指在文档或者浏览器中发生的一些特定交互瞬间&#xff0c;比如打开某一个网页&#xff0c;浏览器加载完成后会触发load事件&#xff0c;当鼠标悬浮于某一个元素上时会触发hover事件&#xff0c;当鼠标点击某一个元素时会触发click事件等等。 三…

电子签章与SSL证书:区别与功能对比

电子签章是一种用于电子文档的签名技术&#xff0c;它通过密码学方法确保文档的完整性、真实性和签署行为的不可否认性。电子签章技术结合了图像处理技术和电子签名技术&#xff0c;使得电子文档在法律上与传统纸质文件具有同等效力。这种技术通常用于需要法律认可的电子合同、…

【Matlab函数分析】对二维或三维散点数据插值函数scatteredInterpolant

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

部署和发布

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、打包 Spring Boot 项⽬二、上传jar包至服务器三.启动项目四.停止项目总结 前言 确认服务器已安装好 Java 环境&#xff1b;确保服务器有可⽤的 MySQL&…

指标+AI:迈向智能化,让指标应用更高效

近日&#xff0c;以“DataAI&#xff0c;构建新质生产力”为主题的袋鼠云春季发布会圆满落幕&#xff0c;大会带来了一系列“AI”的数字化产品与最新行业沉淀&#xff0c;旨在将数据与AI紧密结合&#xff0c;打破传统的生产力边界&#xff0c;赋能企业实现更高质量、更高效率的…

Mac读写U盘软件哪个好用 Mac读写U盘很慢怎么解决 macbookpro读取u盘

在使用Mac电脑时&#xff0c;读写U盘是一个常见的需求&#xff0c;特别是当U盘格式为NTFS时。选择适合的软件来实现这一操作至关重要。下面我们来看Mac读写U盘软件哪个好用&#xff0c;Mac读写U盘很慢怎么解决的相关内容。 一、Mac读写U盘软件哪个好用 在Mac上选择一款适合的…

美国网站服务器解决方案

在当今互联网时代&#xff0c;网站是企业宣传、营销和销售的最好方式&#xff0c;因此&#xff0c;选择一个适合自己企业的网站服务器解决方案很重要。美国作为全球网络基础设施最发达的国家之一&#xff0c;其网站服务器解决方案具有以下特点&#xff1a; 一、安全性高 作为全…

5个方便好用的Python自动化脚本

相比大家都听过自动化生产线、自动化办公等词汇&#xff0c;在没有人工干预的情况下&#xff0c;机器可以自己完成各项任务&#xff0c;这大大提升了工作效率。 编程世界里有各种各样的自动化脚本&#xff0c;来完成不同的任务。 尤其Python非常适合编写自动化脚本&#xff0…

【JAVA】PO、VO、DAO、BO、DTO、POJO你分得清吗?

在Java开发中&#xff0c;PO、VO、DAO、BO、DTO、POJO这些词汇是比较常见的&#xff0c;每个术语都有其特定的含义和用途。下面是它们的具体区别&#xff1a; 名称简要概况用途和特定PO (Persistence Object) 持…

c++11详解

目录 1.列表初始化 2.声明 3.右值引用和移动语句 4. c11新的类功能 5. 可变参数模板 6.lambda表达式 7.包装器 8. 后言 1. 列表初始化 1.1 {}的初始化 (1) c98标准规定可以使用{}对数组以及结构体进行统一的列表初始化. struct Point {int _x;int _y; };int main() {in…

OpenStack的基本操作

1.实例类型管理 首先用管理员账号登录OpenStack 点击创建实例类型后&#xff1a;可以看见实例类型创建成功 2.项目与租户管理 Openstack有严格的项目及租户管理制度&#xff0c;在项目中使用管理员创建项目&#xff0c;然后为该项目创建一个以你姓名命名的账户为该项目的管理…

N5245B PNA-X 微波网络分析仪

N5245B PNA-X 微波网络分析仪 " 900 Hz/10 MHz 至 50 GHz " N5245B PNA-X 微波网络分析仪&#xff0c;900 Hz/10 MHz 至 50 GHz&#xff0c;2 端口和 4 端口&#xff0c;多达三个信号源。 特点 实现卓越性能 这款 PNA-X 分析仪不仅仅是一款矢量网络分析仪&a…

每日两题 / 46. 全排列 41. 缺失的第一个正数(LeetCode热题100)

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 经典回溯题&#xff0c;每次搜索选择未选择数字中的一个 当选择了n个数时&#xff0c;将已经选择的数加入答案 class Solution { public:vector<vector<int>> permute(vector<int>& nums) {vector…

进制转换问题

1.十进制转二进制&#xff08;善于使用__int128&#xff09; 3373. 进制转换 - AcWing题库 #include<bits/stdc.h> using namespace std; __int128 x; int x_; string s1; int main(){stack<int> s;while(cin>>s1){int lens1.size();for(int i0;i<len;i)…

短视频素材怎么做?视频素材库那个好?

在这个视频内容占据主导的时代&#xff0c;高质量的无水印视频素材不仅能够丰富视觉体验&#xff0c;还能显著提升你的作品吸引力。为了帮助你在广阔的创意海洋中航行&#xff0c;下面介绍的一系列视频素材网站将为你的项目注入新的活力&#xff0c;让每个创意的火花都能闪耀发…

react之初识state

第二章 - 添加交互 State: 组件的记忆 组件通常需要根据交互更改屏幕上显示的内容。输入表单应该更新输入字段&#xff0c;单击轮播图上的“下一个”应该更改显示的图片&#xff0c;单击“购买”应该将商品放入购物车。组件需要“记住”某些东西&#xff1a;当前输入值、当前…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …