我正在尝试使用数组实现队列ADT作业作业(由我决定我会使用链表,但我想教授希望我们学习新东西或XD的东西)。无论如何,我正在研究一种方法来将一个元素添加到队列的末尾,这个方法应该创建一个新的重新调整大小的数组,如果它超出范围,这就是我正在努力的方法( enqueue()方法)。这是我的代码:
import java.util.Arrays;
public class Queue<T> implements QueueInterface<T> {
private T[] a;
private int sz;
public Queue(int capacity) {
sz = 0;
@SuppressWarnings("unchecked")
T[] tempQueue = (T[])new Object[capacity];
a= tempQueue;
}
public void enqueue(T newEntry) {
try {
for (int i=0; i<a.length; i++) {
if (a[i] == null) {
a[i] = newEntry;
break;
}
}
sz++;
}
catch (ArrayIndexOutOfBoundsException e) {
@SuppressWarnings("unchecked")
T[] tempQueue = (T[])new Object[a.length*+5];
a= tempQueue;
for (int i=0; i<a.length; i++) {
if (a[i] == null) {
a[i] = newEntry;
break;
}
}
}
}
public T dequeue() {
T result = a[0];
a[0] = null;
for (int i=1; i<a.length;i++) {
a[i-1] = a[i];
}
sz--;
return result;
}
public T getFront() {
return a[0];
}
public boolean isEmpty() {
for (int i=0; i<a.length; i++) {
if (a[i] != null) {
return false;
}
}
return true;
}
public void clear() {
for (int i=0; i<a.length; i++) {
a[i] = null;
sz--;
}
}
@Override
public String toString() {
return "Queue [a=" + Arrays.toString(a) + ", sz=" + sz + "]";
}
}
非常感谢大家的时间!!!
答案 0 :(得分:2)
如果要使用数组实现队列,我认为最好的方法是使用循环数组。这样,当dequeue
时,您不必将所有元素向前移动一步。但是,由于您希望实现一个可重新调整大小(on-bounded)的队列,因此循环数组实现变得有点困难。这是一些有用的链接,
如果你想要一个实现,只需谷歌吧。
(这可能不是您问题的答案,但我无法对您的问题发表评论。)
答案 1 :(得分:1)
检查阵列长度以检测外部 - 异常是昂贵的。
要复制数组,请创建适当大小的新数组,然后使用System.arrayCopy
经验法则不是将尺寸增加固定数量,而是增加原始尺寸的百分比(例如增大30%)
答案 2 :(得分:0)
尝试将调整大小逻辑放入名为ensureSize
的私有方法中。检查所需的尺寸;如果它太小,请调整阵列大小并复制内容。从可能需要增加数组大小的任何方法调用此方法。
答案 3 :(得分:0)
您的实现可能不是使用数组实现队列的最有效方法,但鉴于您决定以这种方式实现它,您的排队方法比它需要的要复杂一些。
您有一个字段sz
,可用于确定新条目的放置位置,而不是通过检查来查找第一个非空值。无论如何,搜索非null都无法正常工作,因为dequeue没有清除最后一个向前移动的元素。
sz
字段还会告诉您何时需要调整大小,而不是通过异常检测到该需求。
答案 4 :(得分:0)
补充Alan Krueger的回答:在调整大小时,你不必再遍历整个数组。创建一个临时变量,用于存储旧数组的长度并开始迭代它。