一、这是个什么玩意
队列就好比咱们排的队,排在头的人最先进过主席台,排在尾的最后进过主席台,一个词——先进先出,书面一点就是队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。一般用法在队头插入,在队尾删除。
记住,队列终究它就是个buf,buf就是存东西的,保存不丢失,可以理解为在buf上封装了一些操作。
二、有毛用啊
1、用于任务间通信,尤其对于单任务系统,多个任务都操作一个队列,比如,A任务往队列里扔数据,B任务负责检查队列,只要有数据就进行处理,起到了两个任务通信的效果,同样可以把这个数据理解为消息,A任务给B任务发消息,B任务根据不同的消息(数据)做不同的处理。
2、缓冲数据。最常见的就是串口接收数据,搞一个环形buf队列,收到数据就放到这个队列中,当然这个buf肯定是有长度的,不能一直存储数据。正常用法下,得及时读取走,这样就能一直接收数据不丢失。
三、怎么用啊
自己先写个队列的实现,就知道怎么用了
#include <stdio.h>
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;
}
//queue space numbers
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 numbers
int queue_deep(my_queue *queue)
{
int size = 0;
int num = queue->Out;
while(num != queue->In)
{
size++;
num = (num + 1)%queue->queueSize;
}
return size;
}
//1:empty.0:not empty
int queue_empty(my_queue *queue)
{
return (queue->In == queue->Out)?1:0;
}
//1:full.0:not full
int queue_full(my_queue *queue)
{
return ((queue->In + 1) % queue->queueSize == queue->Out)?1:0;
}
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 queue_print(my_queue *queue)
{
char num = 0;
if(queue_empty(queue))
{
printf("queue already empty!!!\n");
return 0;
}
for(num = queue->Out;num != queue->In;num = (num + 1)%queue->queueSize)
{
printf("QueueValue[%d]:%d\n",num,queue->buffer[num]);
}
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 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);
}
四、成为大神的用法
1、串口接收用
2、单片机开发的时候,任务间通信用
3、待续