Appearance
题目
表达式 x+y*(z-u)/v 的等价后缀是( )
错因
B
把 * 和 / 的执行顺序搞反了。原表达式 y*(z-u)/v 中,* 与 / 同优先级、左结合:先算 y*(z-u) 再除以 v。所以后缀里应该是先 * 后 /,即 ...*v/;选 B 写成 ...v/* 等于让 / 先于 * 完成,把 v 直接除到了 (z-u) 上,含义变成 y * ((z-u)/v),运算次序错了。
C
写成了前缀(波兰式)而不是后缀(逆波兰式)。后缀的特征是"运算符跟在两个操作数之后",前缀则是"运算符在前"。+x/*y-zuv 这种"运算符全部在最前"的形式正是前缀。题目问的是后缀,看错题了。
D
同样把后缀做成了前缀。+x*y/-zuv 中所有运算符都在操作数之前,是前缀表达式。把求 +/*///- 在表达式里的位置(中缀靠中间)和后缀里的位置(在两操作数之后)混淆,反而退到了前缀位置。
总解析
中缀转后缀的标准思路:操作数顺序不变,运算符按"优先级 + 左结合"的执行顺序,依次跟在它们的两个操作数后面。
把原式按运算优先级显式补上括号:
从最内层开始转换:
| 步骤 | 中缀片段 | 后缀片段 |
|---|---|---|
| 1 | z - u | zu- |
| 2 | y * (z - u) | yzu-* |
| 3 | (y*(z-u)) / v | yzu-*v/ |
| 4 | x + ... | xyzu-*v/+ |
每一步只是把当前层级的运算符挪到它两个子表达式的后面,操作数 x, y, z, u, v 自始至终维持原顺序。
最终答案是 A(xyzu-*v/+)。