我在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开始。