Help trying to understand modulo operation in circular array

China☆狼群 提交于 2019-12-23 18:32:46

问题


i have a small issue trying to figure out how a modulo operation is being calculated. I am building up a queue, so i have a circular array. i cannot figure out how this modulo operation works.

Given q: an array of Character of 5 elements length, The MAX constant gives the max length of the array "5" rare is an int which represents the first available spot in the array 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;
}

Now, supposing that the rare "first empty spot" is three, what is the rare value going to be after the method has finished? this is what i dont get, rare=(rare+1)%MAX means rare=4%5 which gives rare=0,8.

Same for method size:

public int size() {

    return (MAX - front + rear) % MAX;
}

Given, front, an int variable which represents the first element in the array Suppose front is 1 and rare 4, so there are 3 elements in the array, so size is (5-1+4)%5 which is 8%5 which gives 1.6, while the actual size is 3 Any suggestion? this might be more math then java but probably some of you came across the same doubt before. Thank you!


回答1:


I think you're a bit conofused as to what the modulo operation does. It gives the integer remainder after a division. So from your example.

4 % 5 = 4 (because 4/5 is 0, with a remainder of 4)

AND

8 % 5 = 3 (because 8/5 is 1 with a remainder of 3)

Without seeing the rest of your implementation, its a bit difficult to explain further why modulo is being used, but it looks like its basically being used to ensure that your circular array wraps around. i.e. when you hit the end of the array (say index 7, of an array with MAX size 8, the next value you would want would be the first element, which would be 8%8 or 0).




回答2:


integer arithmetic will only result in integers. While modulo is related to division it is not division.

a % b is the same as (a - a / b * b) 

As loops it is the same as. (Assuming b is positive)

int result = a;
while(a >= b) a -= b;
while(a + b <= 0) a += b;

However for rare = (rare + 1) % MAX, it is the same as.

rare = (rare == MAX - 1 ? 0 : rare + 1);


来源:https://stackoverflow.com/questions/5964771/help-trying-to-understand-modulo-operation-in-circular-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!