1、队列的原理和作用
1、1 队列的原理
队列的原理其实就像一个管道,如果我们不断的往管道里塞乒乓球,每个乒乓球在管道里就会排列一条队列,先进去的乒乓球会先出来,这个就是队列先进先出的规则

球从左边进去的动作叫入列,然后进去的球在管道里排成一个队列,这个叫队列缓存,说白了就类似于一个数组,那么存了五个球就相当于是buff[5];这样的意思,从最右边出来的球也是进去最早的球,这个动作也叫出列,所以遵循了先进先出的规则
1、2 队列的作用
队列最主要的作用就是用来缓存数据,比方说串口接收数据,我们一般定义一个数组来存储数据,但是假如串口数据频率很快,可能这个数组里存储的数据还没处理完,下一组数据又过来了,那么这时候数组里的数据就会被新数据覆盖,导致老数据丢失,像这样就可以通过队列的方式来处理,每收到一个字节的数据都先入列,然后在应用程序同步解析处理,根据先进先出的规则那么老的数据就不会被新的数据覆盖了
基于这样的缓存数据的技术,可以灵活应用在各种场景,例如说大数据处理,操作系统的消息传递等等
2、队列程序的设计思路
其实实现队列的方法有很多种,但是工作原理都是一样的,我们要编写代码,首先要很清楚队列的工作原理,那么我们这里总结队列的三个核心关键点:
1、队列缓存
2、入列
3、出列
一个队列是不是基本需要这三个必要的操作,那么队列缓存很好理解,就是定义一个数组,数组大小就是队列缓存的大小,入列就是把一个或若干数据按照顺序存到队列缓存数组里,同样出列就是把数据从队列缓存里按顺序取出来,那么原理我们懂了,接下来思考一个问题,入列和出列怎么用程序实现
2、1 入列操作
根据我们前面的理论,入列其实就是把数据存进数组的操作,我们平时存数组一般都是buff[0]=i;这种操作,那么入列其实也没那么简单,因为要考虑队列里当前存在多少个数据的情况,如果有数据,那么我们就不能从[0]这个下标开始入列,所以我们在入列时要考虑两个问题
1、队列缓存可以存储的数组下标位置,我们这个一般称为队尾
2、队列是否已满,如果队列缓存满了又有新的数据入列,该怎么处理?这里我们一般处理方式是按照时间顺序,把最早入列的数据丢弃,以新的数据替换
那么第二个问题我们先暂时不管,我们来看第一个问题,我们前面的课程学过数组与指针,通过指针的特性,我们在用一个指针变量表示队尾,然后通过这个队尾指针指向队列缓存数组的首地址,当入列一个数据时,我的队尾指针就加1,这样就能知道当前队列缓存的可存储位置地址了
2、2 出列操作
数据入列以后自然要取出来,那么我们取的时候呢也是有原则的,不能乱取,而是从最早入列那个数据的地址开始取,所以这个出列的数组下标我们称为队头,同样的我们可以使用指针变量来代表队头
我们看下下面这个图是一个出列的流程,我们这个是满编队的队列,总共有五个数据,那么队头指针指向队列缓存首地址,接着第一个出列的就是数据1,出列后队头指针+1,就指向了数据2的地址,那么数据2出列后,队头指针又+1,以此类推,就能实现先进先出的操作