NOIP 提高组初赛 · NOIP 2009 提高组初赛试题 第 6 题

选择题 · 答案 B · 考点:运算符与表达式、栈(stack)

← 整套速查表 NOIP 提高组初赛 全部真题

题目

表达式 $\texttt{a*(b+c)-d}$ 的后缀表达式是:

答案:B

考点

运算符与表达式栈(stack) 讲解 →栈(stack) 真题汇总 →

解题思维

这题就是考中缀转后缀(逆波兰)的栈操作。拿到题别慌,记住口诀:数字直接写,左括号进栈,右括号把栈里能弹的都弹出来,遇到运算符就先把栈里比它优先级高的弹掉,再把自己压进去。最后把栈里剩的再清一遍,答案自然就出来了。

常见错误

学生最容易栽跟头的地方是括号处理。很多人看到 a*(b+c) 里的加号,下意识觉得它优先级低就不弹,或者把括号里的内容当成整体直接往后放,结果把乘号的位置搞错。还有的同学会忽略栈的清空步骤,导致末尾多出来一个运算符。另外,优先级判断要死磕:乘法肯定比加法高,括号里的加法必须先算,所以加号必须在乘号前面输出,这点一旦搞反,选项 A、C 就都成了陷阱。

详细解析(节选)

这道题考查的核心知识点是后缀表达式(逆波兰表达式)及其中缀转后缀的栈操作规则。命题人喜欢在括号和运算符优先级交界处挖坑,因为这是学生凭直觉最容易出错的地方:很多人会把括号里的运算顺序想当然地直接对应到输出顺序,而忽略了栈的“后进先出”特性。咱们得把规则掰开揉碎了说:从左到右扫描中缀表达式,遇到操作数(比如 a、b、c、d)直接输出;遇到左括号 ( 就无条件入栈;遇到右括号 ) 就要把栈顶运算符依次弹出输出,直到遇到左括号为止(左括号本身不输出);遇到普通运算符时,要把栈里所有优先级大于等于它的运算符弹出来,然后再把自己压进栈里。扫描完整个表达式后,栈里还剩下的运算符要全部弹出输出。

现在咱们把手里的式子 a*(b+c)-d 按这个流程走一遍: 1. 扫到 a,直接输出 a,栈空。 2. 扫到 *,栈空,直接压栈,栈里是 [*]。 3. 扫到 (,压栈,栈里是 [* (]。 4. 扫到 b,输出 b,栈不变。 5. 扫到 +,栈顶是 (,不能弹,直接压栈,栈里是 [* ( +]。 6. 扫到 c,输出 c,栈不变。 7. 扫到 ),这时候要把栈里能弹的都弹出来,直到遇到 (。所以 + 弹出输出,栈里剩下 [* (],然后遇到 ( 停止,左括号不输出,栈里是 [*]。 8. 扫到 -,这时候栈顶是 *,* 的优先级高于 -,所以必须先把 * 弹出来输出,栈里空了,再把 - 压进去,栈里是 [-]。 9. 扫到 d,输出 d,栈不变。 10. 扫描结束,栈里还剩一个 -,把它弹出来输出。

把输出连起来就是:a b c + * d -,写紧凑点儿就是 **abc+*d-**。

咱们再回头看看选项,A 是 abcd*+-,这明显是把乘法放到了加法后面,而且括号里的加法没先算,顺序全乱;C 是 abc*+d-,这里把乘号提前了,导致加法在乘法之后,违背了括号优先的原则;D 则是完全反过来的前缀形式。只有 B 完全符合我们刚才一步步推导的结果。

从考频数据来看,运算符与表达式这个考点在题库里一共出现过 261 次,覆盖了近十年的所有级别,其中 2023 年一下子考了 91 题,2024 年 41 题,2025 年 61 题,2026 年 14 题,说明这类题目在近年来的初赛和 GESP 考试中热度极高,尤其是 NOIP 提高组初赛里每年都有涉及(2026 年已出 14 题)。栈的考点也考了 89 次,同样在 2024-2026 年爆发式增长。这提示我们,中缀转后缀这种基础但容易混淆的题型,在未来几年大概率还会以单选或填空的形式高频出现,甚至可能出现更复杂的嵌套括号或自定义运算符优先级的变体。

所以,下次遇到这种题,千万别急着选,先在草稿纸上按规则走一遍栈的操作,特别是括号闭合那一刻和运算符优先级比较那一刻,多检查两遍,就能稳稳避开命题人的坑。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断