我在enqueue()类中遇到了CircularArrayQueue方法:

public void enqueue (T element) {
if (size() == queue.length){
expandCapacity();
}
queue[rear] = element;
rear = (rear+1) % queue.length;
count++;
}


我不太了解代码的rear = (rear+1) % queue.length;部分的功能,有人可以分解该代码行的步骤吗?

我确实知道随着新元素的添加,它会增加rear,但是我不确定%操作。

最佳答案

可视化发生情况的一种方法是想象一个时钟(通常用作模块化算术的类比,它发生在使用%运算符提到的行中)。

例如,假设CircularArrayQueue目前的大小为4,长度为5(索引0-4)。在下面的示例中,后方的当前值为4(索引4)

内部数组中的项目可能如下所示:

INDEX | 0 | 1 | 2 | 3 | 4 |
VALUE |   | 8 | 9 | 2 | 1 |
                        ^
                        |
                       Rear


现在假设您将值7插入CircularArrayQueue,然后将

rear = (rear + 1) % queue.length;


将被执行。这将有效地计算以下内容:

add 1 to rear (4) -> 5
divide by queue.length (5) -> 5 / 5 = 1 (remainder of 0)
take the remainder of the previous division (0) and set it equal to rear

INDEX | 0 | 1 | 2 | 3 | 4 |
VALUE | 7 | 8 | 9 | 2 | 1 |
        ^
        |
       Rear


因此,在完成所有这些步骤之后,后方现在等于0,并指向CircularArrayQueue内部数组中的第一个索引。索引到达数组末尾时会“环绕”数组的这种行为是CircularArrayQueue特有的循环行为。

与时钟相关的方式是,时钟的分针在达到60时总是“回绕”,而“复位”为0。

换句话说,上面示例中使用的内部数组可以被视为只有5分钟的时钟(索引0-4)。您可以将(rear + 1)视为按时前进一分钟。在“分针”(后)增加4次之后,它再次从0开始。

10-05 22:49