CircularArrayQueue类中的入队方法

时间:2014-01-18 15:01:27

标签: java queue adt

我在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,因为添加了一个新元素,但我不确定%操作。

3 个答案:

答案 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索引处插入下一个元素。