数据结构(Java)之队列(2)-循环队列的思路

出队操作每个元素都要进行移动,时间复杂度为O(n)级别
循环队列则能很好的解决这个问题
数据结构(Java)之队列(2)-循环队列的思路
我们用front 来指向队首的位置
tail指向队尾的后一个位置(也就是下个入队元素应该待得位置)
此时front == tail 表示队列为空

若有元素入队,只需要维护tail向后移动一位(tail++)数据结构(Java)之队列(2)-循环队列的思路
假设现在队列中有5个元素数据结构(Java)之队列(2)-循环队列的思路
如果要出队一个元素,a出队,维护front++,指向此时队列中的第一个元素(队首)
数据结构(Java)之队列(2)-循环队列的思路

结论:入队维护rail 出队维护front

数据结构(Java)之队列(2)-循环队列的思路
当队列处于此图状态时,再有元素入队
tail操作应该是当前的索引+1 %(取余) 整个数组的长度 如下图
数据结构(Java)之队列(2)-循环队列的思路
上图的队列中再填加一个元素,队列变成下面这个样子
数据结构(Java)之队列(2)-循环队列的思路
此时再有一个元素入队,front == tail 此时 队列已满
为了与队列为空做区别
所以只剩下一个位置的时候,我们就可以认为此时队列已满,需要进行扩容操作.capacity中,浪费了一个空间
准确来说应该是 (tail + 1)%c等于front 表示队列满(c表示数组的长度)