先进先出,队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。一般用法在队头插入,在队尾删除。
队列终究它就是个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);}
运行结果如下图所示:
运行结果
全部0条评论
快来发表一下你的评论吧 !