后缀表达式及应用

  • 概念相关
  • 后缀表达式求值
  • 中缀到后缀的转换
  • 用后缀表达式构造一颗表达式树

概念相关

后缀(postfix)又称为逆波兰记法(reverse Polish notation)。


后缀表达式求值

当一个表达式以后缀记法给出时,无需知道任何优先规则。
算法描述:当遇到一个数时就把它压入栈中;在遇到一个操作符时,该操作符就作用于从该栈弹出的两个数上,再将所得结果压入栈中。
例如,后缀表达式:6523+8*+3+*
前4个数字放入栈中,此时栈变成(右边是栈顶)
6 | 5 | 2 | 3 |    |    |    |    |
下面读到一个+号,3和2从栈中弹出计算,他们的和5再被压入栈中。
6 | 5 | 5 |    |    |    |    |    |
接着8进栈
6 | 5 | 5 | 8 |    |    |    |    |
现在读到*号,8和5弹出并且8*5=40进栈
6 | 5 | 40 |    |    |    |    |    |
如此重复,以下只给出过程栈图
6 | 45 |    |    |    |    |    |    |
6 | 45 | 3 |    |    |    |    |    |
6 | 48 |    |    |    |    |    |    |
288 |    |    |    |    |    |    |    |


中缀到后缀的转换

只允许操作符“+”、“*”、“(”、“)”。“(”进栈前优先级最高,在栈中优先级最低。
算法描述:依次读入字符。当读到一个操作数的时候,立刻把它放到输出中;当读到操作符“+”、“*”、“(”中的任何一个,从栈中弹出栈元素直到发现优先级更低的元素为止,然后该操作符进栈;当读到操作符“)”时将元素弹出直到遇到一个对应的“(”。
算法思想:栈代表挂起的操作符。在当前操作符要进栈之前,那些栈中比它优先级高或相等的操作符就应该弹出完成计算。
例如,中缀表达式:a + b * c + (d * e + f) * g
转换成后缀表达式是:a b c * + d e * f + g * +。过程如下:
后缀表达式及应用_第1张图片
后缀表达式及应用_第2张图片
后缀表达式及应用_第3张图片


用后缀表达式构造一颗表达式树

算法描述:类似后缀求值算法,一次一个符号地读入表达式。如果符号是操作数,那么就建立一个单结点树并将它压入栈中;如果是操作符,那么就从栈中弹出两棵树T1和T2(T1先弹出)并形成一颗根为操作符的新树,它的左右儿子分别是T2和T1,然后将这颗新树压入栈中。
例如,后缀表达式:a b + c d e + * *。(栈从左到右增长)
前两个符号是操作数,因此创建两棵单结点树并将指向它们的指针压入栈中。
后缀表达式及应用_第4张图片
后缀表达式及应用_第5张图片

你可能感兴趣的:(算法)