取模队列

3
我正在学习数据结构的基础知识(队列),目前我理解了队列的流程,但我不明白何时需要使用取模运算符。有几个问题让我感到困惑。如何回答这些问题(参见图片)?

你的问题也让我感到困惑。我也看不出队列和你发布的问题之间的关联。你能提供更多的背景信息吗? - honk
@honk 我不知道如何回答这个问题(参考图片)。例如,当 REAR=4;N=5 时,执行操作 REAR=(REAR+1)%N 后,REAR 的值是多少?其中 (N) 是队列的最大大小。 - Edie
请阅读@Namfuak的答案。他给出了足够的解释,以便您自己能够解决方程。 - honk
@honk 确实,先生。抱歉。^^ - Edie
2个回答

5
处理循环队列的最佳方法是将其绘制出来。由于圆形在ASCII艺术中不太容易表现,因此我将使用线性数组。
+---+---+---+---+---+  
|   |   |   |   |   |  
+---+---+---+---+---+  
  0   1   2   3   4  
                  ^  
                 Rear  

REAR的索引为4。

让我们一步步来进行操作。
第一步:将REAR加1。这会使REAR指向数组之外:

+---+---+---+---+---+  
|   |   |   |   |   |  
+---+---+---+---+---+  
  0   1   2   3   4   5   
                      ^  
                      Rear  

应用取模运算符 %,这将给我们 5 / 5 的余数,也就是零:

+---+---+---+---+---+  
|   |   |   |   |   |  
+---+---+---+---+---+  
  0   1   2   3   4     
  ^  
 Rear  

因此,模运算会像一个圆圈一样绕过数组。

下一个问题需要你解决。记得画出数组或队列。你可以使用圆圈(想象一下被切成片的馅饼或披萨)。

编辑 1:模详细信息
当除数为N时,模运算将给出0..N范围内的值。

给定N == 4,这里是一些模运算的结果:

Index result
0       0
1       1
2       2
3       3
4       0  --> The remainder of 4 / 4 == 0.
5       1
6       2
7       3
8       0  -->  The remainder of 8 / 4 == 0.

1
谢谢您的解释,先生...我欠您太多了。现在我明白了这个队列的流程。 - Edie

2

求模运算返回两个操作数的余数。例如,4%2=0,因为4/2=2没有余数,而4%3=1,因为4/3=1有余数1。由于余数永远不能大于右操作数,对于任何模数,您都有一个有效的答案“范围”,从0(n-1)。考虑到这一点,只需为变量插入数字((4+1)%5=?(1+1)%4=?)。通常,要找到余数,您需要使用长除法,但需要记住的一个有用的事情是,任何数除以自己的余数为0,而任何数除以较大的数的余数等于它本身。


哦,我现在记起来了,谢谢您的解释,先生。很高兴您来这里帮忙。我现在明白问题了。抱歉。^^ - Edie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接