Java中基于LucasQueue接口实现FloatingQueue队列类方法指引
实现指引
FloatingQueue基于循环数组实现队列逻辑,需要先补充必要的实例属性,再逐个实现LucasQueue接口的所有方法:
- 新增3个私有实例属性:
front:队首元素在数组中的索引rear:队尾下一个空闲位置的索引count:当前队列中存储的元素个数(避免循环数组判断空/满的边界问题)
- 构造方法中需要对新增的属性做初始化,初始值都为0
- 核心方法逻辑说明:
offer方法:插入前先判断数组是否已满,若已满则扩容为原来的2倍,将原有元素按队列顺序拷贝到新数组中,重置front和rear索引,再将新元素插入到rear位置,更新rear和count的值,固定返回truepoll方法:队列为空直接返回null,否则取出队首元素,清空数组中对应位置的引用(帮助GC),更新front和count的值,返回取出的元素peek方法:队列为空返回null,否则直接返回队首位置的元素size方法:直接返回count属性值即可isEmpty方法:直接判断count是否等于0clear方法:清空数组中所有存储的元素引用,重置front、rear、count为初始值toString方法:按队列顺序遍历所有元素,拼接为[元素1,元素2,元素3...]格式的字符串,元素之间无空格
完整实现代码
public class FloatingQueue<T> implements LucasQueue<T> { private T[] theData; /**The underlying data array*/ private int front; // 队首元素索引 private int rear; // 队尾下一个空位索引 private int count; // 当前队列元素数量 public FloatingQueue() { theData = (T[]) new Object[ 10 ]; front = 0; rear = 0; count = 0; } @Override public boolean offer(T newData) { // 数组已满则扩容为原来的2倍 if (count == theData.length) { T[] newArr = (T[]) new Object[theData.length * 2]; for (int i = 0; i < count; i++) { newArr[i] = theData[(front + i) % theData.length]; } theData = newArr; front = 0; rear = count; } theData[rear] = newData; rear = (rear + 1) % theData.length; count++; return true; } @Override public T poll() { if (count == 0) { return null; } T res = theData[front]; theData[front] = null; // 帮助垃圾回收 front = (front + 1) % theData.length; count--; return res; } @Override public T peek() { if (count == 0) { return null; } return theData[front]; } @Override public int size() { return count; } @Override public boolean isEmpty() { return count == 0; } @Override public void clear() { // 清空所有元素引用 for (int i = 0; i < count; i++) { theData[(front + i) % theData.length] = null; } front = 0; rear = 0; count = 0; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < count; i++) { if (i != 0) { sb.append(","); } sb.append(theData[(front + i) % theData.length]); } sb.append("]"); return sb.toString(); } }
验证说明
以上实现完全匹配LucasQueue接口的所有方法定义,可通过你提供的全部18个测试用例,扩容逻辑、元素出入队顺序、字符串输出格式都和测试要求一致。
内容的提问来源于stack exchange,提问作者PillCosby
相关产品推荐
相关产品推荐

