06真题讲解 应为 rear指示队尾元素之后的位置。不然06 07两道题就冲突了

来源:6-2 考点2:栈和队列

czh666

2025-02-18

rear指示队尾元素时

q.rear = ( q.front + q.size - 1 + M ) % M

q.size = ( q.rear - q.front + 1 + M ) % M

rear指示队尾元素之后的位置时

q.rear = ( q.front + q.size + M ) % M

q.size = ( q.rear - q.front + M) % M
写回答

2回答

正在学习的小林同学

2025-05-11

我同意你的说法,06的题很矛盾,如果按照rear指示队尾的元素的位置的情况下,当队列为空,公式q.size = ( q.rear - q.front + 1 + M ) % M  就会出现q.size=1的情况,也是矛盾的,应该说rear为队尾元素的下一个位置。07的题没明说q.rear,感觉就是在玩文字游戏,就是让你求最后一个元素所在的位置

0
0

郝老狮

2025-04-11

06是求队长,选D。

解析:设队列容量为 M 。当 Q.rear >= Q.front 时 ,(Q.rear - Q.front + M) % M 等价于 (Q.rear - Q.front) % M ,

结果就是正常的队列元素个数;当 Q.rear < Q.front 时,Q.rear - Q.front 为负数,加上 M 后再对 M 取模,

能得到正确的队列长度,符合循环队列长度计算要求,所以 D 选项正确。


07是求尾指针,选B。

解析:在循环队列中,已知队头位置 Q.front 和队列长度 Q.size 。

如果不考虑循环情况,队尾位置(队尾元素所在位置)在队头位置基础上加上队列长度再减 1 (因为队头是第 1 个元素位置,往后数 Q.size 个元素,队尾是第 Q.size 个,相对队头的偏移是 Q.size - 1 ),即 Q.front + Q.size - 1 。

但循环队列存储空间是环形的,当 Q.front + Q.size - 1 超过队列存储空间容量 M 时,就需要通过取模运算回到队列起始位置附近。所以要先加上 M (保证结果为正 )再对 M 取模,得到通用的队尾元素位置计算公式 (Q.front + Q.size - 1 + M) % M 。


选项分析:

A 选项:(Q.front + Q.size - 1) 没有考虑循环情况,当计算结果超出队列容量 M 时,无法正确表示队尾位置,所以 A 错误。

B 选项:(Q.front + Q.size - 1 + M) % M 符合上述循环队列队尾位置计算逻辑,所以 B 正确。

C 选项:(Q.front - Q.size) 不符合队尾位置计算逻辑,队尾位置应是在队头位置基础上往后移动,而不是往前减,所以 C 错误。

D 选项:(Q.front - Q.size + M) % M 同样计算逻辑错误,不应该是队头减队列长度,所以 D 错误。


0
0

2025年备考火热报名,国家级认证 软件设计师-中级

新考纲通关备考系统指南,助你高效备考,顺利通关

131 学习 · 53 问题

查看课程