详细了解队列的特点及用处

描述

队列的特点:

      先进先出,队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。一般用法在队头插入,在队尾删除。

      队列终究它就是个buf,buf就是存东西的,保存不丢失,可以理解为在buf上封装了一些操作。

队列的用处:

1、用于任务间通信,尤其对于单任务系统,多个任务都操作一个队列,比如,A任务往队列里扔数据,B任务负责检查队列,只要有数据就进行处理,起到了两个任务通信的效果,同样可以把这个数据理解为消息,A任务给B任务发消息,B任务根据不同的消息(数据)做不同的处理。

2、缓冲数据。最常见的就是串口接收数据,搞一个环形buf队列,收到数据就放到这个队列中,当然这个buf肯定是有长度的,不能一直存储数据。正常用法下,得及时读取走,这样就能一直接收数据不丢失。

队列的几个基本的使用包括:

  1. 队列的创建;
  2. 队列的添加元素,删除元素,提取元素等对队列的操作;

队列的创建:首先定义一个队列的大小,这里直接定义为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);}

运行结果如下图所示:

 

队列运行结果

 

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分