CSP-J 入门级 · CSP 2021 入门级第一轮 第 9 题

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

← 整套速查表 CSP-J 入门级 全部真题

题目

表达式 $\texttt{a*(b+c)*d}$ 的后缀表达式为( ),其中 $\texttt{*}$ 和 $\texttt{ + }$ 是运算符。

答案:B

考点

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

解题思维

中缀转后缀的核心口诀是:操作数照抄,左括号压栈,右括号弹栈,遇到运算符看优先级——比栈顶高就压栈,低或相等就弹栈。遇到右括号才真正弹出括号内的内容。按这个流程走一遍,就能稳稳锁定答案。

常见错误

最容易掉进两个坑:一是看到右括号就机械地弹栈,忘了右括号本身不进栈,它只是触发‘弹出直到左括号’的动作;二是处理同级运算符时,误以为‘后进先出’意味着后出现的*应该留在栈里,其实后缀表达式里同级运算符必须按出现顺序逐个弹出(即左结合),否则就会把 a*(b+c)*d 算成 a*(b+c*d)。另外,有些同学会混淆中缀和后缀的计算顺序,以为后缀是从右往左算,其实后缀依然是从左往右扫描,只是操作符跟在操作数后面,所以计算时不用括号也能按优先级正确执行。

详细解析(节选)

本题考查:栈在中缀表达式转后缀表达式中的应用,属于基础但极其重要的考点。

概念梳理: 中缀表达式是我们日常书写的形式,如 a*(b+c)*d,操作符夹在操作数中间,需要括号或优先级规则来明确运算顺序。后缀表达式(也叫逆波兰式)则是将操作符写在操作数之后,例如 abc+*d*,它的最大好处是不需要括号,且计算规则统一:从左到右扫描,遇到操作数就入栈,遇到操作符就弹出栈顶两个数计算后再入栈。

命题视角: 命题人特别喜欢考这种‘转换规则’题,因为它既考察对栈操作的理解,又考察对运算符优先级和结合性的细节把握。最常见的手术刀就是括号:学生往往把右括号当成普通符号去弹栈,或者在处理多级嵌套时漏掉某一层。另外,同级运算符的‘左结合’特性也常被挖坑——很多人凭直觉认为栈是后进先出,所以后出现的*应该留在栈里,其实后缀表达式要求同级运算符按出现顺序依次弹出,这样才能还原中缀的左结合逻辑。

思考心法: 拿到题先别急着写代码,脑子里过一遍‘扫描指针’: 1. 看到操作数(a, b, c, d),直接输出。 2. 看到左括号,压栈(作为标记)。 3. 看到右括号,弹出栈顶直到遇到左括号为止,把弹出的操作符都输出(右括号本身不输出)。 4. 看到操作符,比较优先级:如果栈顶优先级更高或相等,就弹出栈顶;否则压栈。 5. 扫描结束后,把栈里剩下的操作符全弹出。

逐步推导: 表达式:a*(b+c)*d

最终输出序列:a b c + * d *,对应选项 B。

验算: 后缀 abc+*d* 的计算过程: push a, push b, push c → 遇到 + → pop c, pop b → b+c → push 结果 遇到 * → pop (b+c), pop a → a*(b+c) → push 结果 push d → 遇到 * → pop d, pop a*(b+c) → a*(b+c)*d ✅

避坑提醒: 千万别把右括号当成运算符去弹栈,它只是触发‘弹出到左括号’的开关;也别以为同级运算符后出现的应该留在栈里,后缀表达式里同级必须按出现顺序逐个弹出,否则计算结果会完全错误。

同考点真题

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