队列的特点:
先进先出,队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。一般用法在队头插入,在队尾删除。
队列终究它就是个buf,buf就是存东西的,保存不丢失,可以理解为在buf上封装了一些操作。
队列的用处:
1、用于任务间通信,尤其对于单任务系统,多个任务都操作一个队列,比如,A任务往队列里扔数据,B任务负责检查队列,只要有数据就进行处理,起到了两个任务通信的效果,同样可以把这个数据理解为消息,A任务给B任务发消息,B任务根据不同的消息(数据)做不同的处理。
2、缓冲数据。最常见的就是串口接收数据,搞一个环形buf队列,收到数据就放到这个队列中,当然这个buf肯定是有长度的,不能一直存储数据。正常用法下,得及时读取走,这样就能一直接收数据不丢失。
队列的几个基本的使用包括:
- 队列的创建;
- 队列的添加元素,删除元素,提取元素等对队列的操作;
队列的创建:首先定义一个队列的大小,这里直接定义为int型数组,最大存储6个元素。定义一个结构体存放队列的信息,包括数组的指针,用于后续对数组的操作,定义好结构体后对结构体进行初始化
int queuebuffer[6]={0};typedef struct _Tag_My_Queue_{ int *buffer; unsigned char In; unsigned char Out; int queueSize;}my_queue;void queueInit(my_queue *queue,int *buffer,int bufferSize){ queue->buffer = buffer; queue->In = 0; queue->Out = 0; queue->queueSize = bufferSize;}
队列空间 与队列数据数量的函数如下:
int queue_space(my_queue *queue){ int size =queue->queueSize; int num = queue->Out; while(num != queue->In) { size--; num = (num + 1)%queue->queueSize; } return size - 1;}//queue data numbersint queue_deep(my_queue *queue){ int size = 0; int num = queue->Out; while(num != queue->In) { size++; num = (num + 1)%queue->queueSize; } return size;}
如果要对队列增加和删除元素要进行队列的相关操作。定义函数如下:
int addDataToQueue(my_queue *queue,int data){ if(queue_full(queue)) { printf("queue already full!!!\n"); return 0; } queue->buffer[queue->In] = data; queue->In = (queue->In + 1) % queue->queueSize; return 1;}int deleteDataFromQueue(my_queue *queue,int *data){ if(queue_empty(queue)) { printf("queue already empty!!!\n"); return 0; } *data = queue->buffer[queue->Out]; queue->Out = (queue->Out + 1) % queue->queueSize; return 1;}
队列生成后要进行队列的元素判断,队列是否为空,或者是否队列已满,定义函数如下:
int addDataToQueue(my_queue *queue,int data){ if(queue_full(queue)) { printf("queue already full!!!\n"); return 0; } queue->buffer[queue->In] = data; queue->In = (queue->In + 1) % queue->queueSize; return 1;}int deleteDataFromQueue(my_queue *queue,int *data){ if(queue_empty(queue)) { printf("queue already empty!!!\n"); return 0; } *data = queue->buffer[queue->Out]; queue->Out = (queue->Out + 1) % queue->queueSize; return 1;}
下面就对队列 的数据进行相关的操作,包括增加数据入队列,数据出队列等相关的操做,运行函数观察运行起来的状态。
void main(){ my_queue testqueue; int data; queueInit(&testqueue,queuebuffer,sizeof(queuebuffer)/sizeof(queuebuffer[0])); addDataToQueue(&testqueue,55); addDataToQueue(&testqueue,3); addDataToQueue(&testqueue,2); addDataToQueue(&testqueue,33); addDataToQueue(&testqueue,6);printf("queue data is %d\r\n",queue_print(&testqueue)); printf("---queue deep:%d\n",queue_deep(&testqueue)); printf("---queue space:%d\n",queue_space(&testqueue)); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); printf("---queue deep:%d\n",queue_deep(&testqueue)); printf("---queue space:%d\n",queue_space(&testqueue)); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); addDataToQueue(&testqueue,45); addDataToQueue(&testqueue,22); addDataToQueue(&testqueue,33); deleteDataFromQueue(&testqueue,&data); printf("data:%d\n",data); printf("data:%d\n",deleteDataFromQueue(&testqueue,&data)); printf("---queue deep:%d\n",queue_deep(&testqueue)); printf("---queue space:%d\n",queue_space(&testqueue)); queue_print(&testqueue); printf("In:%d,Out:%d\n",testqueue.In,testqueue.Out);while(1);}
运行结果如下图所示:
![poYBAGKUgcmAfgcpAABhQIfmPK0474.png](https://file.elecfans.com/web2/M00/46/82/poYBAGKUgcmAfgcpAABhQIfmPK0474.png)
-
数据
+关注
关注
8文章
7200浏览量
89853 -
函数
+关注
关注
3文章
4350浏览量
63067 -
队列
+关注
关注
1文章
46浏览量
10932
发布评论请先 登录
相关推荐
Labview Queue State Machine(队列状态机)
用VDK+BF537开发产品中,想详细了解一下VDK中事件、事件bit、信号量的使用方法,以及如何写自己的device drivers
请大神通俗易懂的描述一下队列以及状态机用处和用法
详细了解下ups的相关计算
嵌入式软件中的队列有何特点
详细了解一下STM32F1的具体电路参数
一文详细了解OpenHarmony新图形框架
![一文<b class='flag-5'>详细了解</b>OpenHarmony新图形框架](https://file.elecfans.com//web2/M00/3F/8E/poYBAGJo0sOAPyDaAACO3vSCQkk637.png)
带您一起详细了解IEEE802.3bt(PoE++)的有关特点
![带您一起<b class='flag-5'>详细了解</b>IEEE802.3bt(PoE++)的有关<b class='flag-5'>特点</b>](https://file1.elecfans.com/web2/M00/BB/B5/wKgaomWWH56ANL58AAAmEtc8i3c166.png)
评论