数据结构之队列篇
1 队列之特点及在嵌入式软件中的应用
队列(queue)是一个简单线性表,它是一个允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列(queue)遵循先进先出(FIFO, First-In-First-Out)的特征,和**栈(LIFO, Last In First Out)**刚好相反。
主要鉴于FIFO的结构特点,在嵌入式软件应用中主要应用于异步处理的buffer,例如,在CAN或者SPI等接口在中断接收到数据,存放在队列中(入队),而实际的处理解析(出队)将在其他线程或者任务中实现。另外还应用与先进先出的阻塞的某些特殊的应用环境,例如笔者做过的一个错误消息的弹出框,依次等待按键按下,依次弹出已经保存好的错误消息
2循环队列的由来
循环队列的目的主要是为了解决在队列元素出队以后,剩余空间的浪费问题,如下
3 C代码
/
这个创建的是一个循环队列:
初始时:head == tail == 0
其中为了判断队列是否为空或是否为满了, 有必要记录上一次的操作是什么
1、如果上次操作是:入队列 && head == tail :说明是队列满了
2、如果上次操作是:出队列 && head == tail : 说明是队列为空了。
*/
#include"stdio.h"
#include"stdlib.h"
#define Boolean unsigned char
#define UserDataType int
typedef struct
{
UserDataType *data;
int head;
int tail;
int maxRoom;
Boolean lastAction;
}QueueData_Type;
#define OUT_QUEUE 1
#define IN_QUEUE 0
#define TRUE 1
#define FALSE 0
//对队列进行初始化
Boolean InitQueue(QueueData_Type **queue,int maxRoom);
//销毁队列
void destoryQueue(QueueData_Type **queue);
//判断队列是否满了
Boolean isQueueFull(QueueData_Type *queue);
//判断队列是否满了
Boolean isQueueEmpty(QueueData_Type *queue;
//入队列
Boolean InQueue(QueueData_Type *queue, USER_TYPE data);
//出队列
Boolean OutQueue(QueueData_Type *queue, USER_TYPE *data);
//读取队列最头位置
Boolean readQueue(QueueData_Type queue, USER_TYPE *value);
/*创建队列*/
Boolean InitQueue(QueueData_Type **queue,int maxRoom)
{
Boolean ret = TRUE;
if (*queue ==