循环队列通过牺牲一个存储单元,可以区分队空和队满两种状态。
看到这题先想循环队列的队空判空条件 rear==front,再看队满判满条件 rear==(front+1)%size。发现 rear==front 既可能是空也可能是满,无法区分。命题人考的就是这个冲突点。解决冲突的经典方案就是牺牲一个存储单元,让 rear 永远比 front 多占一个位置(即 rear 最多只能走到 front+1 的位置),这样 rear==front 就只能是空,rear==front+1 就只能是满,完美区隔。
错误选项 B 的设计逻辑是让学生误以为"牺牲空间"是多余操作。其实命题人利用的是"队空判空条件"和"队满判满条件"的冲突点:如果只用 rear==front 判空,rear==front 时既可能是空也可能是满,无法区分。牺牲一个存储单元,让 rear 永远比 front 多占一个位置(即 rear 最多只能走到 front+1 的位置),这样 rear==front 就只能是空,rear==front+1 就只能是满,完美区隔。
本题考查循环队列在 GESP 八级大纲中的核心考点,属于数据结构与算法模块。命题人放这道题,就是要卡住那些只背"队空判空条件 rear==front"的考生——他们往往忽略"队满判满条件 rear==(front+1)%size"与"队空判空条件"的冲突,导致无法区分空满状态。
看到"循环队列"先想队空判空条件 rear==front,再看"队满"判满条件 rear==(front+1)%size。发现 rear==front 既可能是空也可能是满,无法区分。命题人考的就是这个冲突点。解决冲突的经典方案就是牺牲一个存储单元,让 rear 永远比 front 多占一个位置(即 rear 最多只能走到 front+1 的位置),这样 rear==front 就只能是空,rear==front+1 就只能是满,完美区隔。
错误选项 B 的设计逻辑是让学生误以为"牺牲空间"是多余操作。其实命题人利用的是"队空判空条件"和"队满判满条件"的冲突点:如果只用 rear==front 判空,rear==front 时既可能是空也可能是满,无法区分。牺牲一个存储单元,让 rear 永远比 front 多占一个位置(即 rear 最多只能走到 front+1 的位置),这样 rear==front 就只能是空,rear==front+1 就只能是满,完美区隔。
如果命题人把"牺牲一个存储单元"改成"使用额外标志位",答案依然正确,但考察点就从"空间换状态"变成了"状态标记"。如果改成"牺牲两个存储单元",答案就错了,因为牺牲两个单元会导致队空判空条件失效(rear==front 时可能还有两个空位)。如果改成"牺牲一个存储单元但允许 rear 走到 front+2",答案就错了,因为 rear==front+2 时既可能是空也可能是满,无法区分。