后缀表达式
- 后缀表达式相对于中缀表达式数值顺序不变
- 后缀表达式通过控制运算符的出现顺序控制表达式的计算顺序,因此后缀表达式不需要使用括号改变计算顺序
- 表达式中每个运算符的执行会将2个可求值的表达式(或值)和1个运算符转化为一个可求值的表达式
后缀表达式的执行
- 顺序遍历后缀表达式
- 当读取到数值时将其压入栈
- 当读取到运算符时,弹出两个数值栈的元素执行计算。将计算的结果压入数值栈
- 当表达式读取完后弹出栈顶值
中缀表达式
校验规则
- 表达式中的括号必须成对出现
- 左括号不能出现在运算符之前
- 右括号不能出现在运算符之后
- 去除掉括号后表达式中数值与运算符应该间隔出现
中缀表达式的求值算法
- 高优先级的运算符先于低优先级的运算符执行,例如:表达式1+2*3 中 * 优先于 + 执行
- 括号能够改变表达式的执行优先级,括号只影响与括号相连表达式的执行顺序
- 括号前后运算符所在表达式的执行依赖于括号内表达式的执行,例如:表达式1*(6-3)/2中 (6-3) 优先于 * 和 / 执行
- 括号内 的表达式遵从1~3
中缀表达式求值
中缀表达式转成后缀表达式
中缀表达式转后缀表达式
算法
- 遍历中缀表达式
- 若输入项是数值则直接输出
- 若输入项是左括号则将其压入栈
- 若输入项是右括号则弹出栈中的运算符并输出直至遇到左括号,弹出左括号
- 若输入项是运算符循环执行6~9的判断
- 若栈为空则运算符入栈
- 若栈顶是左括号则将运算符压入栈
- 若栈顶运算符优先级低于它则将运算符压入栈
- 否则弹出栈顶运算符并输出,重回5
- 遍历完表达式后,若栈不为空循环弹出栈顶运算符并输出直至栈为空
算法分析:
- 当前运算符执行时机由它与后接运算符的相对优先级决定。当其小于后接运算符时暂存运算符;否则输出当前运算符;
- 左括号的优先级大于其前接运算符;
- 当遇到右括号时才需要执行并完成其对应左括号内的表达式;
- 运算符的输出即可理解为表达式的执行;
- 当运算符优先级大于后接运算符时,由于“输出”操作可能导致“多米诺骨牌”效应,因此需要循环执行,直至栈为空、栈顶运算符为左括号、栈顶运算符优先级小于当前运算符为止。
posted @
2022-07-11 11:28
bavaria
阅读(
121)
评论()
收藏
举报