帮助尝试理解圆形阵列中的模运算

JBo*_*Boy 3 java arrays queue modulo

我有一个小问题试图弄清楚模运算是如何计算的。我正在建立一个队列,所以我有一个循环数组。我无法弄清楚这个模运算是如何工作的。

给定 q:一个长度为 5 个元素的字符数组,MAX 常量给出了数组的最大长度 "5" 罕见是一个整数,它表示数组 q 中的第一个可用位置

    public void enqueue(Character c)throws FullQueueException{

    if(size()== MAX -1){ //if only 1 place left, is full, throw exc 

        throw new FullQueueException("Queue is full");
    }
    q[rare]=c;  
    rare=(rare+1)%MAX;
}
Run Code Online (Sandbox Code Playgroud)

现在,假设稀有的“第一个空位”是 3,那么方法完成后稀有值是多少?这是我没有得到的,rare=(rare+1)%MAX 表示rare=4%5,这给出了rare=0,8。

方法大小相同:

public int size() {

    return (MAX - front + rear) % MAX;
}
Run Code Online (Sandbox Code Playgroud)

给定,front,一个表示数组中第一个元素的 int 变量假设前面是 1 和罕见的 4,所以数组中有 3 个元素,所以大小是 (5-1+4)%5 也就是 8%5给出 1.6,而实际大小是 3 有什么建议吗?这可能比 java 更数学,但可能你们中的一些人之前遇到过同样的疑问。谢谢!

tsc*_*ble 5

我认为您对模运算的作用有点困惑。它给出除法后的整数余数。所以从你的例子来看。

4 % 5 = 4(因为 4/5 为 0,余数为 4)

8 % 5 = 3(因为 8/5 是 1,余数是 3)

在没有看到您的其余实现的情况下,进一步解释为什么使用模有点困难,但看起来它基本上用于确保您的圆形阵列环绕。即,当您到达数组的末尾时(例如,最大大小为 8 的数组的索引 7,您想要的下一个值将是第一个元素,即 8%8 或 0)。