算术表达式求值

后缀表达式

  1. 后缀表达式相对于中缀表达式数值顺序不变
  2. 后缀表达式通过控制运算符的出现顺序控制表达式的计算顺序,因此后缀表达式不需要使用括号改变计算顺序
  3. 表达式中每个运算符的执行会将2个可求值的表达式(或值)和1个运算符转化为一个可求值的表达式
 

后缀表达式的执行

  1. 顺序遍历后缀表达式
  2. 当读取到数值时将其压入栈
  3. 当读取到运算符时,弹出两个数值栈的元素执行计算。将计算的结果压入数值栈
  4. 当表达式读取完后弹出栈顶值
 
0
 

中缀表达式

校验规则

  1. 表达式中的括号必须成对出现
  2. 左括号不能出现在运算符之前
  3. 右括号不能出现在运算符之后
  4. 去除掉括号后表达式中数值与运算符应该间隔出现
 

中缀表达式的求值算法

  1. 高优先级的运算符先于低优先级的运算符执行,例如:表达式1+2*3 中 * 优先于 + 执行
  2. 括号能够改变表达式的执行优先级,括号只影响与括号相连表达式的执行顺序
  3. 括号前后运算符所在表达式的执行依赖于括号内表达式的执行,例如:表达式1*(6-3)/2中 (6-3) 优先于 * 和 / 执行
  4. 括号内 的表达式遵从1~3
 

中缀表达式求值

 
0
 

中缀表达式转成后缀表达式

 
0
 
 

中缀表达式转后缀表达式

算法

  1. 遍历中缀表达式
  2. 若输入项是数值则直接输出
  3. 若输入项是左括号则将其压入栈
  4. 若输入项是右括号则弹出栈中的运算符并输出直至遇到左括号,弹出左括号 
  5. 若输入项是运算符循环执行6~9的判断
  6. 若栈为空则运算符入栈
  7. 若栈顶是左括号则将运算符压入栈
  8. 若栈顶运算符优先级低于它则将运算符压入栈
  9. 否则弹出栈顶运算符并输出,重回5
  10. 遍历完表达式后,若栈不为空循环弹出栈顶运算符并输出直至栈为空
 

算法分析:

  1. 当前运算符执行时机由它与后接运算符的相对优先级决定。当其小于后接运算符时暂存运算符;否则输出当前运算符;
  2. 左括号的优先级大于其前接运算符;
  3. 当遇到右括号时才需要执行并完成其对应左括号内的表达式;
  4. 运算符的输出即可理解为表达式的执行;
  5. 当运算符优先级大于后接运算符时,由于“输出”操作可能导致“多米诺骨牌”效应,因此需要循环执行,直至栈为空、栈顶运算符为左括号、栈顶运算符优先级小于当前运算符为止。
 
posted @ 2022-07-11 11:28  bavaria  阅读(121)  评论(0)    收藏  举报