我在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
,因为添加了一个新元素,但我不确定%
操作。
答案 0 :(得分:1)
可视化正在发生的事情的一种方法是想象一个时钟(通常用作模运算的类比,这在您使用%运算符提到的行中发生)。
例如,假设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)。您可以将(后方+ 1)视为时钟前进一分钟。在“分针”(后方)增加4次后,它再次从0开始。
答案 1 :(得分:0)
rear = (rear+1) % queue.length;
实现循环。由于CircularArrayQueue
类名称表明它是循环的。这意味着当到达最后一个元素(queue.length
- th)时,它开始从头开始插入元素。如果rear = (rear+1) % queue.length
,则rear+1
会返回rear+1 < queue.length
,如果rear+1 == queue.length
,则会返回0,在这种情况下,它会从数组的开头插入元素。
答案 2 :(得分:0)
它基本上舍入了循环队列的队列索引。
假设你的数组queue.length == 10,所以当后面增加到10时,它将四舍五入为0以在0索引处插入下一个元素。