一、如何理解队列
可以想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进先出,这就是典型的队列。
栈只支持两个基本操作:入栈和出栈。队列和栈非常相似,支持的操作也很有限,基本的操作也是两个:入队,放一个数据到队列尾部;出队,从队列头取一个元素。所以队列和栈一样,也是一种操作受限的线性表数据结构。
二、队列的实现
用数组实现的队列叫作顺序队列。用链表实现的队列叫作链式队列。
顺序队列:需要两个指针,一个head指针指向队头;一个是tail指针指向队尾。经过不停的出队入队,head指针和tail指针都会持续往后移动。当tail指针移动到最右边以后,出队是没有问题的,再入队时触发一次数据搬移。将head到tail中的数据搬移到数组中0到tail的位置,然后再进行入队操作。
三、循环队列
循环队列,最关键的是,确定好队空和队满的判定条件。
四、阻塞队列和并发队列
阻塞队列其实就是再队列基础上增加了阻塞操作。简单来说,就是在队列为空的时候,从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲的位置后在插入数据,再返回。
线程安全的队列叫作并发队列、实际上基于数组的循环队列,利用CAS原子操作,可以实现非常高效的并发队列。这也是循环队列比链式队列应用更加广泛的原因。