嵌入式学习第三十二天!(队列)

1. 队列的定义:

    队列:是只允许一端进行数据插入,而另一端进行数据删除的线性表。(先进先出FIFO),如下图所示。

    队列的应用:缓冲区,即解决高速设备和低速设备数据交互的时候,速度不匹配问题

2. 存储结构:

    1. 顺序队列:循环队列

        空队列:初始两个指针都指向a1元素,如下图的左图所示;

        队列满的条件:(rear+1) % QueueSize == front,即牺牲空间来判断是否为满队列,如下图的右图所示。

        入队时:rear指针向尾部移动,front指针则依旧指向首元素,如下图的左图所示;

        出队时:front指针向下一个元素移动,释放出队元素,尾指针不变,如下图的右图所示。

        我们把头尾相接顺序存储结构称为循环队列

        1. 循环队列的定义:
typedef int DATA_TYPE;typedef struct que
{DATA_TYPE *pbase;int front;int rear;int maxSize;
}SQE_QUE;
        2. 循环队列的创建:
SQE_QUE *Create_Sqe_Queue(int maxSize)
{SQE_QUE *psqe = malloc(sizeof(SQE_QUE));if(psqe == NULL){perror("fail to malloc");return NULL;}psqe->pbase = malloc(maxSize * sizeof(DATA_TYPE));psqe->front = 0;psqe->rear = 0;psqe->maxSize = maxSize;return psqe;
}
        3. 判断循环队列是否为空或满:
int Is_Empty_Sqe_Queue(SQE_QUE *psqe)
{if(psqe->front == psqe->rear){return 1;}return 0;
}int Is_Full_Sqe_Queue(SQE_QUE *psqe)
{if(((psqe->rear + 1) % psqe->maxSize) == psqe->front){return 1;}return 0;
}
        4. 入循环队列:
int Push_Sqe_Queue(SQE_QUE *psqe, DATA_TYPE data)
{if(Is_Full_Sqe_Queue(psqe)){fprintf(stderr, "Queue full!\n");return -1;}else{psqe->pbase[psqe->rear] = data;psqe->rear = (psqe->rear+1) % psqe->maxSize;}return 0;
}
        5. 出循环队列:
int Pop_Sqe_Queue(SQE_QUE *psqe, DATA_TYPE *data)
{if(Is_Empty_Sqe_Queue(psqe)){fprintf(stderr, "Queue Empty!\n");return -1;}else{if(data != NULL){*data = psqe->pbase[psqe->front];}psqe->front = (psqe->front+1) % psqe->maxSize;}return 0;
}
        6. 读取循环队列队头的数据:
int Find_Front_Sqe_Queue(SQE_QUE *psqe, DATA_TYPE *data)
{*data = psqe->pbase[psqe->front];return 0;
}
        7. 清空循环队列:
void Clear_Sqe_Queue(SQE_QUE *psqe)
{psqe->front = psqe->rear = 0;return;
}
        8. 销毁循环队列:
void Destory_Sqe_Queue(SQE_QUE *psqe)
{free(psqe->pbase);free(psqe);return;
}
        9. 循环队列的遍历(为了方便验证队列是否正确):
void Show_Queue(SQE_QUE *psqe)
{int i = psqe->front;while(i != psqe->rear){printf("%d ", psqe->pbase[i]);i = (i + 1) % psqe->maxSize;	}printf("\n");return;
}

    2. 链式队列:

        队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链式队列

        1. 链式队列的定义:
typedef int DATA_TYPE;typedef struct node
{DATA_TYPE data;struct node *pnext;
}QUEUE_NODE;typedef struct list
{QUEUE_NODE *pfront;QUEUE_NODE *preal;int curlen;}QUEUE_LIST;
        2. 链式队列句柄的创建:
QUEUE_LIST *Create_Queue_List(void)
{QUEUE_LIST *plist = malloc(sizeof(QUEUE_LIST));if(plist == NULL){perror("fail to malloc");return NULL;}plist->pfront = NULL;plist->preal = NULL;plist->curlen = 0;return plist;
}
        3. 链式队列结点的创建:
QUEUE_NODE *Create_Queue_Node(DATA_TYPE data)
{QUEUE_NODE *pnode = malloc(sizeof(QUEUE_NODE));if(pnode == NULL){perror("fail to malloc");return NULL;}pnode->data = data;pnode->pnext = NULL;return pnode;
}
        4. 入队列(尾插法):
int Is_Empty_Queue(QUEUE_LIST *plist)
{return plist->pfront == NULL;
}int Push_Queue_Link(QUEUE_LIST *plist, QUEUE_NODE *pnode)
{if(plist == NULL || pnode == NULL){return -1;}if(plist->pfront == NULL){plist->pfront = pnode;plist->preal = pnode;}else{plist->preal->pnext = pnode;plist->preal = pnode;}plist->curlen++;return 0;
}
        5. 出队列(头删法):
int Pop_Queue_Link(QUEUE_LIST *plist, DATA_TYPE *data)
{if(Is_Empty_Queue(plist)){return 0;}QUEUE_NODE *ptmp = plist->pfront;if(ptmp->pnext == NULL){plist->pfront = NULL;plist->preal = NULL;if(data != NULL){*data = ptmp->data;}free(ptmp);}else{plist->pfront = ptmp->pnext;if(data !=  NULL){*data = ptmp->data;}free(ptmp);}plist->curlen--;return 0;
}
        6. 获取链式队列队头的数据:
int Get_Front_Quene(QUEUE_LIST *plist, DATA_TYPE *data)
{if(Is_Empty_Queue(plist)){return 0;}QUEUE_NODE *ptmp = plist->pfront;*data = ptmp->data;return 0;
}
        7. 清空链式队列:
void Clear_Queue(QUEUE_LIST *plist)
{QUEUE_NODE *ptmp = plist->pfront;while(plist->pfront != NULL){Pop_Queue_Link(plist, NULL);}return;
}
        8. 销毁链式队列:
void Destory_Queue(QUEUE_LIST *plist)
{Clear_Queue(plist);free(plist);return;
}
        9. 链式队列的遍历(为了方便验证队列是否正确):
void Show_Queue(QUEUE_LIST *plist)
{QUEUE_NODE *ptmp = plist->pfront;while(ptmp != NULL){printf("%d ", ptmp->data);ptmp = ptmp->pnext;}printf("\n");return;
}

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

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

相关文章

蓝桥2021A组C题

货物摆放 问题描述格式输入格式输出评测用例规模与约定解析参考程序难度等级 问题描述 格式输入 无 格式输出 输出答案 评测用例规模与约定 无 解析 数字给的相当大所以我们不能直接给他暴力了,不然等很久都跑不出来。由题目我们可以得到让nLxWxH,所…

day77 JSPServlet

知识点: 1Web工程 2JSP是什么?JSP页面包含哪些内容?JSP页面执行原理 3JSP九大内置对象,及四个作用域 4什么是SERVLET?及servlet相关API 5MVC模型 6EL表达式及JSTL标签库的使用 7在JSP页面实现分页和多条件查询 …

QML学习记录:并排页面切换效果的实现

定义一个ApplicationWindow窗口,通过添加SwipeView和PageIndicator来实现页面切换效果和显示当前页面位置的指示器。 ApplicationWindow {id:rootvisible: truewidth: 340height: 480title: qsTr("SwipeView") // 定义一个SwipeView用于页面切换效果 Swip…

python爬虫———激发学习兴趣的案列(第十三天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

【24年更新】如何在OnlyFans购买订阅? OnlyFans银行卡怎么支付?使用虚拟visa支付OnlyFans信用卡教程

1. OnlyFans简介 OnlyFans是一个流行的内容订阅平台,创作者通过粉丝订阅来赚取收入。该平台自2016年成立以来,吸引了包括音乐家、健身教练和摄影师等多种创作者。 2. 虚拟信用卡介绍 虚拟信用卡是一种替代传统银行卡的支付方式,适用于国际…

谈谈功率IC巨头—士兰微

大家好,我是砖一。 今天给大家分享一下士兰微电子公司,,有做功率元器件&开关电源和IC的朋友可以了解一下,希望对你有用~ 1 公司介绍 士兰微电子成立于1997年,于2003年上市,总部位于杭州,…

Spring Boot-01-通过一个项目快速入门

官方参考文档:Spring Boot Reference Documentation 0. 概述 Spring的缺点: 1. 配置繁琐:虽然Spring的组件代码是轻量级,但它的配置却是重量级的。 2. 依赖繁琐:项目的依赖管理也是一件耗时耗力的事情。分析要导入哪…

搭建前后端的链接(java)

搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE,也就是java企业版,也就是java后端(后端javaSE) 利用javaEE和前端交互,javaSE和数据库交互,javaSE和javaEE之间再进行交互就实现了前后端的交互…

【智能算法】省时方便,智能算法统计指标——一键运行~

目录 1.常用统计指标2.参数统计检验3.结果展示4.自定义修改测试框架 1.常用统计指标 测试智能算法性能时,常常会用到以下5种常用指标,简单不赘述: 最优值、最差值、均值、中位数、标准差 2.参数统计检验 单纯依靠常用统计指标说服力不足&…

ZStack Cloud 5.0.0正式发布——Vhost主存储、隔离PVLAN网络、云平台报警优化、灰度升级增强四大亮点简析

近日,ZStack Cloud 5.0.0正式发布,推出了包含Vhost主存储、隔离PVLAN网络、云平台报警优化、灰度升级增强在内的一系列重要功能。云主机管理、物理机运维、密评合规、灾备服务等诸多使用场景和功能模块均有更新,为您带来更完善的平台服务、更…

【Keil5-编译4个阶段】

Keil5-编译 ■ GCC编译4个阶段■ 预处理->编译->汇编->链接■ GNU工具链开发流程图■ armcc/armasm(编译C和汇编)■ armlink (链接)■ armar (打包)■ fromelf (格式转换器&#xff09…

C++ 线程库(thread)与锁(mutex)

一.线程库(thread) 1.1 线程类的简单介绍 thread类文档介绍 在C11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff…

python小练习(ps:可评论区讨论)

1. (单选题)海龟初始坐标为(0,0),让海龟往坐标原点后方移动200像素的语句是 A. turtle.penup(200)B. turtle.fd(200)C. turtle.goto(200)D. turtle.bk(200) 2. (单选题)改变海龟画笔尺寸的是 A. turtle.penwidth()B. turtle.pen…

OpenHarmony分布式软总线API调用测试工具 softbus_tool使用说明

softbus_tool 是 OpenHarmony 分布式软总线 API 调用测试工具,文件结构如下图所示。 softbus_tool 能够将软总线 interfaces 目录下的一些常用接口集中起来,供设备间搭建一些场景时使用(比如设备绑定、BR 组网,BLE 组网&#xff…

linux内核驱动-在内核代码里添加设备结点

linux中,一切皆文件 我们在用户层用一些系统函数(如:fopen等等)时,会进入内核,内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的(驱动)函数 我们在前面已经…

DataX 数据库同步部分源码解析

在工作中遇到异构数据库同步的问题,从Oracle数据库同步数据到Postgres,其中的很多数据库表超过百万,并且包含空间字段。经过筛选,选择了开源的DataXDataX Web作为基础框架。DataX 是阿里云的开源产品,大厂的产品值得信赖&#xff…

51单片机入门_江协科技_20.1_Proteus串口仿真

1.为了解决51单片机学习过程中在Proteus中的串口仿真的问题,需要在Proteus中建立串口仿真的环境(目前Proteus安装在Win7x64虚拟机环境中; 2. 在CSDN中找到VSPD下载地址,在虚拟机中进行VSPD的安装,具体链接地址如下&am…

【Linux】LVM逻辑卷详解

目录 一、LVM的基本概念 1. 为什么要使用逻辑卷 2. LVM的机制 3. 使用LVM的基本命令 二、LVM建立、扩容的过程演示 1. LVM的建立与使用 2. LVM逻辑卷的扩容 3. 扩容根分区 一、LVM的基本概念 磁盘分区的缺点: 没有备份功能 ------> 诞生raid来解决无法…

某狗网歌曲接口逆向之加密算法刨析

逆向网址 aHR0cHM6Ly93d3cua3Vnb3UuY29t 逆向链接 aHR0cHM6Ly93d3cua3Vnb3UuY29tL21peHNvbmcvN2dxcGVzNjguaHRtbA 逆向接口 aHR0cHM6Ly93d3dhcGkua3Vnb3UuY29tL3BsYXkvc29uZ2luZm8 逆向过程 请求方式:GET 逆向参数 signature:1898d8f157837fadc9751fdacf1398f9 …

【洛谷】P9236 [蓝桥杯 2023 省 A] 异或和之和

题目链接 P9236 [蓝桥杯 2023 省 A] 异或和之和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 1. 暴力求解 直接枚举出所有子数组,求每个子数组的异或和,再对所有的异或和求和 枚举所有子数组的时间复杂度为O(N^2)&…