下面循环队列采用“空出一个位置”的方式区分队空和队满。横线处应填写( )。
const int MAXN = 8;
int data[MAXN];
int front = 0, rear = 0;
bool full() {
return __________________________;
}看到循环队列先想空满判别的经典技巧。队列空时 front==rear,但这样无法区分空和满,所以必须空出一个位置。队列满时 rear 恰好比 front 多走一格,用取模运算把环形位置折回线性判断即可。
A 是空的条件,D 是 rear 碰壁的特例,B 把 front 和 rear 位置关系写反了。命题人故意把正确条件 C 写成 (rear+1)%MAXN==front,而 B 写成 (front+1)%MAXN==rear,考察考生是否真正理解"空出位置"后满判的逻辑方向。
本题考查《GESP 六级大纲》数据结构模块的循环队列实现,核心是"空出一个位置"的满判条件。命题人卡住的是考生对环形队列边界条件的理解——绝大多数人背下 front==rear 是空,但不会推导满判,一遇到取模运算就懵。
队列初始 front=rear=0。入队时 rear 先加一再取模:rear = (rear+1)%MAXN;出队时 front 先加一再取模:front = (front+1)%MAXN。这样队列里实际存放的元素个数永远是 rear-front(非负)。当这个差值达到 MAXN-1 时队列满了,即 rear 比 front 多走一格:(rear+1)%MAXN == front。