2014-01-18 63 views
0

我在CircularArrayQueue类遇到的enqueue()方法的代码。排队方法

我明白,它增加了rear作为一个新的元素已被添加,但我不确定%操作。

回答

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

+0

CircularArrayQueue的大小如何可以为4,长度为5,这有点令人困惑? –

+0

内部数组的长度为5,表示其物理大小为5个元素,但其逻辑大小为4 - 5个可用空间中只有4个被元素占用。 –

0

rear = (rear+1) % queue.length;达到循环。由于CircularArrayQueue类名称暗示它是循环的。这意味着当到达最后一个元素(queue.length -th)时,它开始从头开始插入元素。 rear = (rear+1) % queue.lengthrear+1 < queue.length的情况下返回rear+1,如果rear+1 == queue.length的值为0,并且在这种情况下它开始从数组的开始插入元素。

0

它基本上为您的队列索引四舍五入循环队列。

可以说你的数组queue.length == 10,所以当后增加到10时,它将舍入为0以在0索引处插入下一个元素。