下面代码判断队列的第一个元素是否等于 $a$,并删除该元素,横向上应填写( )。
#include <iostream>
#include <queue>
using namespace std;
bool is_front_equal(std::queue<int>& q, int a) {
bool is_equal = false;
if (!q.empty()) {
________________________ // 在此处填入代码
}
return is_equal;
}逻辑代数运算:与(∧/×)、或(∨/+)、非(┐/¬)。德摩根律:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。
注意德摩根律的正确应用:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。C++中逻辑运算符有短路求值特性。
【考点】队列操作|取值与弹出|条件判断
本题考查《GESP 六级大纲》「数据结构与算法」模块中的「队列操作」与「条件判断」。命题人卡住的是考生对front()与pop()调用顺序的混淆——很多人以为先删再比,却忘了front()在空队上会抛异常。
正确链是:先判非空→用q.front()取值判断→再q.pop()删除。若先pop()再取值,空队时front()会崩溃;若只赋值不删,则不满足「删除该元素」的需求。这一类「取值后删除」的题通法是:先判断条件,再执行副作用,避免状态丢失。
A只赋值不删,违背题意;C先删后比,空队时front()抛异常且比的是新头;D混用栈的top(),语义错误。最阴险的是C,它利用考生「先删再比」的惯性思维,且front()在空队上会异常,连调试都难发现。
若把a改为q.size(),则应判断size() > 0再pop();若改成q.pop()后返回,则函数应返回新队首。刷到类似题先问自己「命题人想考我什么」:是考front与pop顺序,还是考空队边界?