3.2.4 表达式求值问题

 例如:
  若  则它的
  前缀式为:
  中缀式为:
  后缀式为:
 
   
 

  因为表达式是递归定义的,则它的转换也是递归的,如此例的后缀式的转换过程如动画演示所示。
  动画
 
   综合比较它们之间的关系可得下列结论
 1.三式中的 "操作数之间的相对次序相同"
 2.三式中的 "运算符之间的的相对次序不同"
 3.中缀式丢失了括弧信息,致使运算的次序不确定;
 4.前缀式的运算规则为:连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最小表达式;
 5.后缀式的运算规则为:
  ・运算符在式中出现的顺序恰为表达式的运算顺序;
  ・每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式;

  以下就分"如何按后缀式进行运算"和"如何将原表达式转换成后缀式"两个问题进行讨论。
 
   1.即转换过程中不改变原表达式中操作数之间的相对次序;
 2.即转换过程主要是改变原表达式中各个运算符之间的相对次序;
 3.因此,中缀式没什么用;
 4.虽然前缀式中已经没有原表达式中的括弧,但它已经包含了原表达式中运算的规则;
 5.若将原表达式转换成它的后缀式,那么我们就可以按后缀式中运算符出现的先后次序来对表达式进行运算了。
 
 
    如何按后缀式进行运算?
  可以用两句话来归纳它的求值规则:
  "先找运算符,后找操作数。" 动画

  从这个例子的运算过程可见,运算过程为:对后缀式从左向右"扫描",遇见操作数则暂时保存,遇见运算符即可进行运算;此时参加运算的两个操作数应该是在它之前刚刚碰到的两个操作数,并且先出现的是第一操作数,后出现的是第二操作数。由此可见,在运算过程中保存操作数的结构应该是个栈。
 
  思考题 这个算法不难吧?你头脑中是不是已经有了这个算法的大致模样了?