版权声明
1. 本站文章和资源均来自互联网收集和整理,本站不承担任何责任及版权问题。
2. 相关版权归作者及其公司所有,仅供学习研究用途,请勿用于商业目的。
3. 若侵犯您的版权,请发邮件至webmaster@ishare1.cn联系我们,我们确认后将立即删除。

循环队列的优点
普通队列出队操作开销大:在出队操作时,索引为0后面的所有元素,都需要往前移动一位,元素越多,消耗的时间也越多,时间复杂度为O(N)。
循环队列的逻辑:
1、当元素较少时(tail位置在front后面),循环队列与普通队列出队操作一样,入队的元素将会放在tail的位置上,随后执行tail++操作;出队时front位置上的元素将会置null,随后执行front++操作;此时仍能保持着tail位置在front后面的状态,如下图所示:

2、当元素继续添加,最后一个元素将放到索引为7的位置,此时tail位置将会移动到队首前面索引为0的位置上,此时tail在数组的索引为变为:(tail+ 1 )% capacity如下图所示:

3、当元素继续添加时,元素将会在tail位置上添加,tail继续往后移动,如下图所示:

4、继续添加元素,当tail与front还相距一个单位时,即此时数组还有一个空余存储空间,但当前数组已经不能继续实现循环队列的插入操作了,因为循环队列判断队列为空的条件就是front == tail,所以此时需要进行扩容操作;因此此处有意识的浪费了一个空间。
此处可以推出,循环队列元素满的条件为:tail +1 == front(初步得出,后续会完善为(tail + 1) % capacity == front )
5、适当情况下,此若时持续进行出队操作,front的位置也将会从数组最右端跳转到数组最左端开始。此时front在数组的索引为变为:(front + 1 )% capacity
代码实现:(相关视频教程分享:java视频教程)
package dataStructure.chapter3; /** * @Author: zjtMeng * @Date: 2019/12/28 20:13 * @Version 1.0 */ public class LoopQueueimplements Queue { private E[] data; private int front,tail; private int size; public LoopQueue(int capacity){ data = (E[]) new Object[capacity+1]; } public LoopQueue(){ this(10); } public int getCapacity(){ return data.length-1; } /** * 循环队列入队操作 * @param e */ @Override public void enqueue(E e) { //循环队列元素满的判断条件,如果满了就进行扩容操作,扩大两倍 if ((tail+1)%data.length == front) resize(2 * getCapacity()); data[tail] = e; tail = (tail + 1) % data.length; size ++; } /** * 循环队列扩容 * @param newCapacity */ private void resize(int newCapacity){ E[] newData = (E[]) new Object[newCapacity+1]; //循环队列第一种遍历方式 for (int i = 0 ; i 相关文章教程推荐:java入门教程
爱分享




