Skip to content

2014年 408 数据结构 第 3 题

数据结构2014年选择题2分

题目

循环队列放在一维数组 A[ 0..M-1] 中,end1 指向队头元素,end2 指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳 M-1 个元素。初始时为空。下列判断队空和队满的条件中,正确的是( )。

错因

B

队空条件对,但队满写错了 mod 的模数:用了 mod (M - 1)
循环队列的模数永远是数组实际大小 M,不是 M-1。M-1 只是"最多容纳元素数",不是数组下标的循环周期;下标在 间循环,必然 mod M。

C

队空写成了 end1 == (end1 + 1) mod M——左边 end1,右边也是 end1 派生出来的;除非 M=1,否则永远不成立。这看起来像是把 end1 和 end2 错位写了,自己跟自己比毫无意义。

D

队空条件 end1 == (end2 + 1) mod M 实际上是队满条件!把队空和队满搞反了。再加上队满又用 mod (M - 1),错上加错。

总解析

普通循环队列回顾(单端入出):

数组大小 M,但牺牲一个单元作为"满/空"的区分位(否则 end1 == end2 既可以是空也可以是满,无法区分),所以最多容纳 M-1 个元素

  • 队空:end1 == end2(两指针重合,且没有元素)
  • 队满:(end2 + 1) mod M == end1(end2 再前进一格就会撞上 end1,但实际不能撞——撞了就和"空"无法区分)

本题特殊条件:"两端均可进行入队和出队操作"——这是个双端循环队列(deque)。但判空判满的核心公式不变,因为 end1 / end2 的语义没变(end1 仍是队头,end2 仍是队尾后一格),只是入出方向更灵活而已。

若题目说的是"双端入出"会改变指针约定(比如左端入队是 end1 后移而不是前移),公式才会变。本题只是允许在两端做操作,end1/end2 还是原意,所以照搬普通循环队列公式即可。

逐项验证(以 M=5、最多 4 元素为例):

  • 初始:end1 = end2 = 0 → end1 == end2 ✓ 空
  • 满状态举例:end1 = 0,end2 = 4(数组下标 0..3 都装了元素,下标 4 留空作分隔)→ (end2 + 1) mod M = (4+1) mod 5 = 0 == end1 ✓ 满

速记:循环队列 mod 永远是 M不是 M-1;M-1 是"容量",M 是"数组大小",模运算只与数组大小相关。

最终答案是 A

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数