我从robert sedgewick的书店看到了这个排队的例子 http://algs4.cs.princeton.edu/13stacks/ResizingArrayQueue.java.html
public void enqueue(Item item) {
// double size of array if necessary and recopy to front of array
if (N == q.length) resize(2*q.length); // double size of array if necessary
q[last++] = item; // add item
if (last == q.length) last = 0; // wrap-around
N++;
}
我不知道这段代码:
if (last == q.length) last = 0; // wrap-around
拉普周围?这是否意味着当我们的数组已满时,它将开始替换之前的项目?我们为什么要这样做?如果无法添加下一个项目,我们是否应该抛出异常?
这是resize方法的最后一行:
q = temp; //now the array is doubled
first = 0;
last = n; //n is the original array size before doubling
因为n和last都会在enqueue方法中递增,并且如果n等于q.length,q的大小将加倍,所以它就像if语句永远不会是真的吗?
答案 0 :(得分:1)
“环绕”是说有限空间中的某些东西超过一端并且在另一端继续存在的习语。这里,“忙”元素N < q.length将在最后附加和前面的删除后,最终“环绕”。
这是完整的resize
;移动之后,它会先处理,最后处理;它会移除一个环绕,如果有的话。
// resize the underlying array
private void resize(int max) {
assert max >= N;
Item[] temp = (Item[]) new Object[max];
for (int i = 0; i < N; i++) {
temp[i] = q[(first + i) % q.length]; // <<< !!!
}
q = temp;
first = 0;
last = N;
}
请注意,数组元素first,...last-1,0,...,last-1
的主要内容已复制到0, 1, ... N-1
。
if (last == q.length) last = 0;
只有在没有进行大小调整时才会执行此操作;它处理新元素必须放在最后一个数组元素之后的数组元素的情况。