关于循环队列的问题
今天有位老师出了一个问题,关于数组的循环队列。 我在网上看相关的实现代码,虽然懂相应的出队和入队规则,但是不懂实现的原理,麻烦老师解答下。头脑有点乱。 以下是循环队列的各种方法;/* * 循环队列 * @param <E> */public class CircleDeQueue<E> { /** * 数组容器 */ private E [] elements; //尾队列指针 private int rear = 0; //头队列指针 private int front = 0; //数组元素个数 private int size = 0; /** * 默认容量长度 */ private int CAPATICY_LENGTH = 10; /** * -1 未查询到元素 */ private static final int ELEMENT_NOT_FOUND = -1; public CircleDeQueue(){ elements = (E[])new Object[CAPATICY_LENGTH]; } /** * 获取元素长度 * @return */ public int size(){ return this.size; } /** * 判断数组容器是否为空,空返回true * @return */ public boolean isEmpty(){ return size == 0; } /** * 尾部入队 * @param element */ public void enQueueRear(E element){ ensureCapacity(size); int index = index(size); elements[index] = element; rear = index; size++; } /** * 头部入队 * @param element */ public void enQueueFront(E element){ ensureCapacity(size); front = index(-1); elements[front] = element; size++; } /** * 头部出队 * @return */ public E deQueueFront(){ if(!isEmpty()){ E element = elements[front]; elements[front] = null; front = index(1); size--; clear(); return element; }else{ throw new NullPointerException("size: "+size); } } /** * 尾部出队 * @return */ public E deQueueRaer(){ if(!isEmpty()){ E element = elements[rear]; elements[rear] = null; rear = index(size - 2); size--; clear(); return element; }else{ throw new NullPointerException("size: "+size); } } /** * 返回队头元素 * @return */ public E frontQueue(){ return elements[front]; } /** * 返回队尾部元素 * @return */ public E rearQueue(){ return elements[rear]; } /** * 清空数据 */ private void clear(){ if(size == 0){ front = 0; rear = 0; elements = (E[]) new Object[DEFAULT_CAPACITY]; } } public String toString(){ StringBuilder sb = new StringBuilder(); sb.append("capacity: "+ elements.length); sb.append(" ,size: "+ size); sb.append(" ,front: " + front); sb.append(" ,rear: " + rear); sb.append("\nCircleQueue"+Arrays.toString(elements)); return sb.toString(); } /** * 数组扩容 */ public void ensureCapacity(int minCapacity){ if(minCapacity >= elements.length){ int length = (elements.length >> 1) + elements.length; E [] newArr = (E[])new Object[length]; for (int i = 0; i < minCapacity; i++) { newArr[i] = elements[index(i)] ; } front = 0; rear = minCapacity-1; elements = newArr; } } /** * 操作循环队列的下标 * @param index * @return */ private int index(int index){ index += front; if(index < 0){ return index + elements.length; } return index % elements.length; }}
正在回答 回答被采纳积分+1
同学你好,
1、CircleDeQueue类的构造方法中elements = (E[]) new Object[CAPATICY_LENGTH];是创建指定类型的数组。例如创建String类型的数组,如下:
CircleDeQueue<String> queue = new CircleDeQueue<String>();
size()方法是获得elements数组中元素的个数。
头部入队enQueueFront()方法:是往数组后面新增数据。尾部入队enQueueRear()方法:往数组前面新增数据。
尾部出队deQueueRaer()方法:按照尾部入队的顺序移除元素。头部出队deQueueFront()方法:按照头部入队的顺序移除元素。
返回队头元素frontQueue()方法:返回头队列指针front所指向的元素。
返回队尾部元素rearQueue()方法:返回尾队列指针rear所指向的元素。
清空数据clear()方法:新建一个数组赋值给elements,并重置front和rear值。
toString()方法:打印elements数组的容量,elements数组中元素的个数,尾队列指针和头队列指针,并输出数组中元素。
2、同学可以新建一个测试类,运行试试。
例如:
CircleDeQueue类整理好格式,如下:
package demo; import java.util.Arrays; /* * 循环队列 * @param <E> */ public class CircleDeQueue<E> { /** * 数组容器 */ private E[] elements; // 尾队列指针 private int rear = 0; // 头队列指针 private int front = 0; // 数组元素个数 private int size = 0; /** * 默认容量长度 */ private int CAPATICY_LENGTH = 10; /** * -1 未查询到元素 */ private static final int ELEMENT_NOT_FOUND = -1; private int DEFAULT_CAPACITY = 10; public CircleDeQueue() { elements = (E[]) new Object[CAPATICY_LENGTH]; } /** * 获取元素长度 * @return */ public int size() { return this.size; } /** * 判断数组容器是否为空,空返回true */ public boolean isEmpty() { return size == 0; } /** * 尾部入队 * @param element */ public void enQueueRear(E element) { ensureCapacity(size); int index = index(size); elements[index] = element; rear = index; size++; } /** * 头部入队 * @param element */ public void enQueueFront(E element) { ensureCapacity(size); front = index(-1); System.out.println("CircleDeQueue.enQueueFront() "+front); elements[front] = element; size++; } /** * 头部出队 * @return */ public E deQueueFront() { if (!isEmpty()) { E element = elements[front]; elements[front] = null; front = index(1); size--; clear(); return element; } else { throw new NullPointerException("size: " + size); } } /** * 尾部出队 * @return */ public E deQueueRaer() { if (!isEmpty()) { E element = elements[rear]; elements[rear] = null; rear = index(size - 2); size--; clear(); return element; } else { throw new NullPointerException("size: " + size); } } /** * 返回队头元素 * @return */ public E frontQueue() { return elements[front]; } /** * 返回队尾部元素 * @return */ public E rearQueue() { return elements[rear]; } /** * 清空数据 */ private void clear() { if (size == 0) { front = 0; rear = 0; elements = (E[]) new Object[DEFAULT_CAPACITY]; } } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("capacity: " + elements.length); sb.append(" ,size: " + size); sb.append(" ,front: " + front); sb.append(" ,rear: " + rear); sb.append("\nCircleQueue" + Arrays.toString(elements)); return sb.toString(); } /** * 数组扩容 */ public void ensureCapacity(int minCapacity) { if (minCapacity >= elements.length) { int length = (elements.length >> 1) + elements.length; E[] newArr = (E[]) new Object[length]; for (int i = 0; i < minCapacity; i++) { newArr[i] = elements[index(i)]; } front = 0; rear = minCapacity - 1; elements = newArr; } } /** * 操作循环队列的下标 * @param index * @return */ private int index(int index) { index += front; if (index < 0) { return index + elements.length; } return index % elements.length; } public E[] getElements() { return elements; } public void setElements(E[] elements) { this.elements = elements; } }
祝学习愉快
- 参与学习 人
- 提交作业 9401 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星