跳到正文

3.3.2 栈在表达式求值中的应用(上)、栈在表达式求值中的应用(下)

40 分钟

3.3.2 表达式求值:优先级决定何时结算

中缀表达式便于人读,却不能简单从左到右计算。可先转后缀:操作数直接输出;左括号入运算符栈;右括号弹到左括号;普通运算符到来时,先弹出栈顶优先级更高的运算符,同为左结合时也弹出同级,再把当前运算符压栈。

3+4*2/(1-5) 转换为 3 4 2 * 1 5 - / +。求后缀值只需数值栈:读数入栈;读运算符时先弹右操作数 b,再弹左操作数 a,计算 a op b 后压回。顺序不能颠倒,减法和除法尤其敏感。

手工推演后缀 8 3 2 * -:压 8、3、2;* 弹 2 与 3 得 6;-b=6,a=8 得 2。若写成 b-a 会得到 -2。

右结合运算符如幂需要特殊处理:当前幂运算符到来时,不应因栈顶同级就立即弹出,否则 a^b^c 会错误地按左结合处理。题目通常会明确运算符集合与结合性。

复杂度为 :每个记号至多入栈、出栈一次,空间 。实现还要处理多位数、空白、一元负号和除零,不能把字符位数等同操作数个数。

错解反馈:认为优先级高就立即计算,忽略尚未读到右操作数;后缀求值弹出顺序颠倒;右括号被输出到后缀式,都是规则层面的错误。

迁移题:把 2*(3+4)-5 转成后缀并求值。答案 2 3 4 + * 5 -,值 9。独立验收:逐个 token 写出输出序列与运算符栈状态。

小纸条

计算:中缀2*(3+4)-5转后缀并求值。

登录 后可看答案

Practice

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。