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

news2024/10/7 12:27:30

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.coloradmin.cn/o/1583209.html

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

相关文章

K8S容器空间不足问题分析和解决

如上图,今天测试环境的K8S平台出现了一个问题,其中的一个容器报错:Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B),意思服务器硬盘空间不够了。这个问题怎么产生的,又怎么解决的呢…

“人工智能+数字人”,让数字技术赋能多领域智能化管理、数字化服务

AI数字人结合了语音合成、语音识别、语义理解、图像处理、虚拟形象驱动等多项AI核心技术,可以实现导览服务、信息播报、互动交流、业务咨询等智能化功能。 如今,AI数字人逐渐被政务、文旅、展馆展厅、博物馆、数字会议、金融、校园等等领域多元化应用&am…

RuoYi-Vue若依框架-vue前端给对象添加字段

处理两个字段的时候有需求都要显示在下拉框的同一行,这里有两种解决方案,一是后端在实体类添加一个对象,加注解数据库忽略处理,在接口处拼接并传给前端,二是在前端获取的数据数组内为每个对象都添加一个字段&#xff0…

Qt | QObject 类中的成员函数存取属性值与动态属性、用反射机制获取属性的信息

1、注册自定义类型与 QMetaType 类 ①、QMetaType 类用于管理元对象系统中命名的类型,该类用于帮助 QVariant 中的类型以及队列中信号和槽的连接。它将类型名称与类型关联,以便在运行时动态创建和销毁该名称。 ②、QMetaType::Type 枚举类型定义了 QMetaType 支持的类型。其…

Golang | Leetcode Golang题解之第11题盛最多水的容器

题目&#xff1a; 题解&#xff1a; func maxArea(height []int) int {res : 0L : 0R : len(height) - 1for L < R {tmp : math.Min(float64(height[L]), float64(height[R]))res int(math.Max(float64(res), tmp * float64((R - L))))if height[L] < height[R] {L} el…

Severt基本使用

severt是让我们自己写一些类,然后把这些类给加载Tomcat中&#xff0c;后续Tomcat收到HTTP请求(来自于浏览器)&#xff0c;就会执行到咱们上面写的代码.从而通过这些代码,完成一定的业务逻辑. 创建项目 此处创建的是一种新的项目的形式称为Maven项目,Maven是Java 中的一个的构建…

微服务项目sc2024第一个子项目

1. 第一个子项目 2.pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

【机器学习300问】66、ReLU激活函数相对于Sigmoid和Tanh激活函数的优点是什么?ReLU它有局限性吗?如何改进?

一、ReLU相对于Sigmoid和Tanh的优点 &#xff08;1&#xff09;计算效率高 ReLU函数数学形式简单&#xff0c;仅需要对输入进行阈值操作&#xff0c;大于0则保留&#xff0c;小于0则置为0。Sigmoid和Tanh需要指数运算但ReLU不需要。所以相比之下它会更快&#xff0c;降低了神经…

MySQL innoDB存储引擎多事务场景下的事务执行情况

一、背景 在日常开发中&#xff0c;对不同事务之间的隔离情况等理解如果不够清晰&#xff0c;很容易导致代码的效果和预期不符。因而在这对一些存在疑问的场景进行模拟。 下面的例子全部基于innoDB存储引擎。 二、场景&#xff1a; 2.1、两个事务修改同一行记录 正常来说&…

每日一题 — 最大连续 1 的个数III

解法一&#xff1a;暴力枚举 先定义left和right双指针&#xff0c;left先固定在起始位置&#xff0c;遍历right当值等于1的时候&#xff0c;直接跳过&#xff0c;等于0的时候&#xff0c;zero计数器加一当zero等于k的时候&#xff0c;就开始记录此时最大长度是多少然后left加一…

urwid,一个好用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - urwid。 Github地址&#xff1a;https://github.com/urwid/urwid Urwid 是一个功能强大的 Python 库&#xff0c;用于创建基于文本的用户界面&#xf…

Linux入门攻坚——18、SELinux、Bash脚本编程续

SELinux——Secure Enhanced Linux&#xff08;安全加强的Linux&#xff09;&#xff0c;工作于Linux内核中。 SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源&#xff08;最小权限原则&#xff09;。采用委任式存取控制&#xff0c;是在进行程序、文件等细节权…

蓝桥杯2023A-05-互质数(Java)

5.互质数 题目描述 给定 a, b&#xff0c;求 1 ≤ x < a^b 中有多少个 x 与 a^b 互质。由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模的结果。 输入格式 输入一行包含两个整数分别表示 a, b&#xff0c;用一个空格分隔。 输出格式 输出一行包含一个…

【MPI并行程序】完美解决Attempting to use an MPI routine before initializing MPI

文章目录 错误原因解决方案 最近在写并行程序&#xff0c;犯了一个小错误&#xff0c;记录一下&#xff0c;以防止以后再犯。 Attempting to use an MPI routine before initializing MPI&#xff08;在初始化 MPI 之前尝试使用 MPI 例程&#xff09; 错误原因 这个错误通常是因…

编写Markdown时如何爽爽地渲染树?

在使用VitePress/Dumi等静态网站生成时&#xff0c;一般均支持直接在Markdown中渲染显示Vue/React组件&#xff0c;这给个网站非常丰富极致的表现力&#xff0c;我们在创建静态网站时开心的使用各种Vue/React组件&#xff0c;但是在输出树结构时&#xff0c;实际场景中存在几个…

Git的简单入门使用

文章目录 拷贝项目的步骤创建项目的步骤提交项目或项目文件的步骤恢复项目文件的步骤推送项目文件的步骤 拷贝项目的步骤 找到需要用来存放项目的文件夹&#xff1b;在文件夹页面空白处右键点击&#xff0c;然后再菜单中选择“Open Git Bash here”。在Github上找到需要进行拷…

【Java核心能力】美团优选后端一面:网络 操作系统

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

Vue2 —— 学习(五)

一、生命周期 &#xff08;一&#xff09;引入案例 我们想让一行文字按一定频率逐渐变得透明 1. Vue 实例外写法 函数写在 Vue 实例外面也能实现但是不推荐 <body><div id"root"><h2 :style"{opacity}">欢迎学习Vue</h2><…

服务器开发 Socket 相关基础

Socket 三要素 1.通信的目的地址&#xff1b; 2.使用的端口号&#xff1b; 3.使用的传输层协议&#xff08;如 TCP、UDP&#xff09; Socket 通信模型 服务端实现 #include <iostream> #include <unistd.h> #include <stdio.h> #include <sys/types.h&…

【QT】pro文件里添加又删除LIBS不影响运行的原因

我发现个问题啊&#xff0c;如果运行项目&#xff0c;发现报错&#xff0c;缺少某dll&#xff0c;接着你在pro文件里加上win32:LIBS -lOpengl32&#xff08;举个例子&#xff09;&#xff0c;接着可以运行了&#xff0c;接着把这行删掉&#xff0c;再运行&#xff0c;仍然可以…