在队列中排队操作

时间:2014-07-28 11:10:42

标签: java algorithm

我从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语句永远不会是真的吗?

1 个答案:

答案 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;     

只有在没有进行大小调整时才会执行此操作;它处理新元素必须放在最后一个数组元素之后的数组元素的情况。