数据结构(Java)之队列(2)-循环队列的思路
出队操作每个元素都要进行移动,时间复杂度为O(n)级别
循环队列则能很好的解决这个问题
我们用front 来指向队首的位置
tail指向队尾的后一个位置(也就是下个入队元素应该待得位置)
此时front == tail 表示队列为空
若有元素入队,只需要维护tail向后移动一位(tail++)
假设现在队列中有5个元素
如果要出队一个元素,a出队,维护front++,指向此时队列中的第一个元素(队首)
结论:入队维护rail 出队维护front
当队列处于此图状态时,再有元素入队
tail操作应该是当前的索引+1 %(取余) 整个数组的长度 如下图
上图的队列中再填加一个元素,队列变成下面这个样子
此时再有一个元素入队,front == tail 此时 队列已满
为了与队列为空做区别
所以只剩下一个位置的时候,我们就可以认为此时队列已满,需要进行扩容操作.capacity中,浪费了一个空间
准确来说应该是 (tail + 1)%c等于front 表示队列满(c表示数组的长度)