本帖最后由 聪聪哥哥 于 2025-8-24 13:59 编辑
队列是一种先进先出(FIFO)的线性数据结构,只允许在队尾插入元素,在队头删除元素。对于队列的操作包括:入队,出队,查看队头元素,判断队列是否为空的操作。
基本特性:先进先出的原则,最先进入队列的元素,最先被移除队列。
主要操作:
入队(enqueue):在队列的尾端添加元素。
出队(dequeue):在队列的首端移除元素。
队列的实现方式如下所示:
1:数组实现:
使用固定大小的数组
需要处理循环队列的情况以避免空间浪费
2:链表实现:
使用单向链表,头指针指向队首,尾指针指向队尾
不需要预先分配固定大小
代码如下所示:
2.1 :定义队列的结构体:
- #define MAXSIZE 20 //队列最大长度
- typedef struct TQelemType //队列每帧数据结构体
- {
- uint8_t uLength; //数据长度
- uint8_t buffer[200]; //数据数组
- }QelemType;
- typedef struct Tsquene //队列结构体
- {
- QelemType *base;
- int front;
- int rear;
- }squene;
2.2 队列初始化:
- /**************************************************************************
- - 功能描述:入队列
- - 参数说明:*s 队列句柄 *e 要入队列数据的地址
- - 返回说明:无
- **************************************************************************/
- void enquene(squene *s,QelemType *e)
- {
- if(((s->rear)+1)%MAXSIZE==s->front)
- {
- return ;
- }
- memcpy(&(s->base[s->rear]), e, sizeof(QelemType));
- s->rear=((s->rear)+1)%MAXSIZE;
- }
2.3 出队列操作:
- /**************************************************************************
- - 功能描述:出队列
- - 参数说明:*s 队列句柄 *e 出队列数据要写入的地址
- - 返回说明:-1 失败 0 成功
- **************************************************************************/
- int8_t dequene(squene *s,QelemType *e)
- {
- if(s->rear==s->front)
- {
- return -1;
- }
- memcpy(e, &(s->base[s->front]), sizeof(QelemType));
- memset(&(s->base[s->front]), 0, sizeof(QelemType));
- s->front=((s->front)+1) % MAXSIZE;
- return 0;
- }
2.4 添加测试字符串函数如下所示:
- void TestBuffer1(void)
- {
- QelemType Data = {0};
- Data.uLength = sizeof (outputchar1); //需要发送的数据长度
- memcpy(&Data,outputchar1,Data.uLength );
- enquene(&QUsart1Tx,&Data);
- }
- void TestBuffer2(void)
- {
- QelemType Data = {0};
- Data.uLength = sizeof (outputchar2); //需要发送的数据长度
- memcpy(&Data,outputchar2,Data.uLength );
- enquene(&QUsart1Tx,&Data);
- }
- void Usart1Txbuffer(void)
- {
- QelemType Data = {0},*PreData = NULL; //创建临时一帧队列数据
- PreData = &Data;
- if(dequene(&QUsart1Tx,PreData) != 0) //出队列
- return;
- memcpy(SendBuffer1,PreData->buffer,PreData->uLength );
- SendDataToUSART1(PreData->uLength );
- }
2.5 在任务回调函数中,添加测试代码如下所示:
- //========================================================================
- // 函数: void task_100ms(void)
- // 描述: 100ms 任务.
- // 参数: None.
- // 返回: None.
- // 版本: V1.0, 2025-08-08
- //========================================================================
- void task_100ms(void)
- {
- Usart1Txbuffer();
- }
- //========================================================================
- // 函数: void task_200ms(void)
- // 描述: 200ms 任务.
- // 参数: None.
- // 返回: None.
- // 版本: V1.0, 2025-08-08
- //========================================================================
- void task_200ms(void)
- {
- TestBuffer2();
- }
- void task_1000ms(void)
- {
- //printf("21论坛测评APM32F402 测评活动 by:聪聪哥哥 \r\n");
- TestBuffer1();
- }
三:测试图片如下所示:
|