Appearance
题目
已知循环队列存储在一维数组 A[ 0..n-1]中,且队列非空时 front 和 rear 分别指向队头元素和队尾元素。若初始时队列空,且要求第一个进入队列的元素存储在 A[0]处,则初始时 front 和 rear 的值分别是( )。
错因
A
套用了"空队列时 front == rear == 0"的常见约定。这个约定本身没错,但配套的入队操作会让第一个元素落到 A[1] 而非 A[0]——因为 rear = (rear+1) % n; A[rear] = x 走完一遍后 rear 变成 1。题目要求"第一个进 A[0]"和这种约定不兼容。
C
front 和 rear 弄反了。题目要求 front 指向队头元素,第一个元素入队后队头是 A[0],所以入队后 front 必须 = 0。又因为入队不会改 front(只改 rear),所以 front 初始就该是 0。C 的 front=n-1 错。
D
rear 初始 n-1 是对的(让 (n-1+1) % n = 0 落到 A[0]),但 front=n-1 错——队头是 A[0],front 应指 0。可能误把"front 和 rear 在空队时取相同值"绑定到任意取值(取 0 或 n-1 都行)。但本题要求第一个元素必须在 A[0],已经把 rear 绑死成 n-1 了,front 不能再跟着取 n-1。
总解析
循环队列的标准入队操作:
c
rear = (rear + 1) % n;
A[rear] = x;反推 rear 初值:题目要求第一个入队元素落到 A[0],即入队后 rear = 0。
反推 front 初值:入队操作不改 front。入队后队头是 A[0],根据题面"front 指向队头元素",入队后 front = 0,所以初始 front 也是 0。
故初始:front = 0, rear = n-1。
「空队判断」:在这种约定下,
(rear + 1) % n == front表示队列空,正好初始时 (n-1+1) % n = 0 = front 成立。
最终答案是 B。