参考文献:颜晶晶 张涛《将中缀表达式转换成后缀表达式的三种方法》
http://blog.csdn.net/glldc/article/details/1818787
第一种:利用栈来实现,该方法为常规方法,论文中也有介绍,但本人认为,该方法不利于记忆,且费时,不足以应付考试的要求。再此不再赘述。
第二种:后序遍历二叉树法:
例:将中缀表达式a+(b-c)*d转换成后缀表达式
第一步:画出其对应的二叉树;
后续遍历该二叉树,得到后缀表达式为:a b c - d * +
附:后续遍历的方法:后序遍历指在访问根结点、遍历左子树与遍历右子树三者中,首先遍历左子树,然后遍历右子树,最后遍历访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。
第三种方法:加括号法--最简便最有创新性的方法,足以应付考试。
加括号法就是先将待求的中级表达式依次排开, 再将每一步要计算的表达式加上括号, 最后将每个运算符移到其所在括号的外面, 这样, 从左到右扫描得到的序列去掉括号后就
是后缀表达式。
仍然是上例:
第一步:按优先级别, 有括号先求括号里的原则, 将每一步要计算的表达式加上括号, 得到表达式为
( a + ( (b-c) *d ) )
第二步:将每个运算符移到其所在括号的外面, 即外移一层
abc-d*+
再例:
将中缀表达式 a+b*c-(d+e)转换为后缀表达式:
第一步:按照运算符的优先级对所有的运算单位加括号~
式子变成了:((a+(b*c))-(d+e))
后缀:把运算符号移动到对应的括号后面
则变成拉:((a(bc)* )+ (de)+ )-
把括号去掉:abc*+de+- 后缀式得到