空队: F=R=0 哨兵=0 入队1次: F=0 R=1 哨兵=1 入队2次: F=0 R=2 哨兵=2 …… 入队7次: F=0 R=7 哨兵=7 再入队: R 追到 F 前 判满,停止 F=0位置不写值这是不是不对, 0 1 2 3 4 5 6 7 队列怎么从左到右入队,队列先进先出,第一个入队的,到第二个入队时候第一个入队的元素应该动态右移动把,其他的一样的
队列中的元素一旦入队,其在数组中的物理位置就固定了,不会“移动”。
正确理解循环队列的工作方式
F(Front):指向队头元素的位置R(Rear):指向下一个可插入位置(即队尾元素的下一个空位)初始状态(空队列):
1数组: [_, _, _, _, _, _, _, _] 2 0 1 2 3 4 5 6 7 3F = 0, R = 0 → 空入队 1(元素 A):
R=0 处写入 AR = (R + 1) % 8 = 11[A, _, _, _, _, _, _, _] 2 0 1 2 3 4 5 6 7 3F=0, R=1入队 2(元素 B):
R=1 写入 BR = 21[A, B, _, _, _, _, _, _] 2 0 1 2 3 4 5 6 7 3F=0, R=2……入队 7 次后(A~G):
1[A, B, C, D, E, F, G, _] 2 0 1 2 3 4 5 6 7 3F=0, R=7第 8 次入队(H):
R=7 写入 HR = (7+1)%8 = 01[A, B, C, D, E, F, G, H] 2 0 1 2 3 4 5 6 7 3F=0, R=0F == R,但队列满了!当(R + 1) % n == F时,判为“满”,禁止再入队。
🔁 出队操作(FIFO 的体现)
array[F],然后 F = (F + 1) % n[A,B,C,D,E,F,G,_](F=0, R=7)出队一次:F = 11[A, B, C, D, E, F, G, _] ← A 还在 0 号位,但已不属于队列! 2 ↑ 3 F=1(现在队头是 B)✅ 回答你的疑问
“第一个入队的元素应该动态右移动吧?”
“F=0 位置不写值是不是不对?”
F 指向的是当前队头元素的位置,这个位置是有值的(除非队列为空)。R 指向的位置,然后 R++F 到 R-1(模 n)之间的位置都是有效元素📌 总结
| 操作 | 行为 |
|---|---|
| 入队 | 在 R 处写值 → R = (R+1) % n |
| 出队 | 读取 F 处的值 → F = (F+1) % n |
| 元素位置 | 一旦入队,物理位置固定,不会移动 |
| 判空 | F == R |
| 判满 | (R + 1) % n == F(牺牲一个单元) |