波兰表达式、逆波兰表达式的转换与计算
1、中缀表达式
人类最熟悉的一种表达式1+2,(1+2)*3,3+4*2+4等等都是中缀表示法。对于人们来说,也是最直观的一种求值方式,先算括号里的,然后算乘除,最后算加减,但是,计算机处理中缀表达式却并不方便,因为没有一种简单的数据结构可以方便从一个表达式中间抽出一部分算完结果,再放进去,然后继续后面的计算。由此便有了前缀表达式(波兰表达式)和后缀表达式(逆波兰表达式)。
[逆]波兰表达式优势:它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。
2、波兰表达式(前缀表达式)
- 转换:将中缀表达式依据优先级关系括起来,将运算符移到对应括号的前方,去掉括号,即得波兰表达式。
- 计算:对于一个波兰表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此作为一个新的“数字串”并记录下来。一直扫描到表达式的最左端时,最后运算的值也就是表达式的值。
- 注意:做减除运算时,栈顶元素减除栈底元素。
示例
中缀表达式:(4-2)/(5-4) 结果:2
转换:
加括号: ((4-2)/(5-4))
移动操作符: /(-(4 2)-(5 4))
去掉括号: /-4 2-5 4
所以对应的波兰表达式为: /-4 2-5 4
计算:
规则:从右至左扫描表达式。
1、遇到4,是操作数,入栈。
2、遇到5,是操作数,入栈。
3、遇到-,是操作符,从顶至下两元素出栈,顶元素5-底元素4得1,1入栈。
4、遇到2,是操作数,入栈。
5、遇到4,是操作数,入栈。
6、遇到-,是操作符,从顶至下两元素出栈,顶元素4-底元素2得2,2入栈。
7、遇到/,是操作符,从顶至下两元素出栈,顶元素2/底元素1得2。最后结果为2。
3、逆波兰表达式(后缀表达式)
- 转换:将中缀表达式依据优先级关系括起来,将运算符移到对应括号的后方,去掉括号,即得逆波兰表达式。
- 计算:对于一个逆波兰表达式的求值而言,首先要从左往右扫描表达式,从左边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此作为一个新的“数字串”并记录下来。一直扫描到表达式的最右端时,最后运算的值也就是表达式的值。
- 注意:做减除运算时,栈底元素减除栈顶元素。
示例
中缀表达式:(4-2)/(5-4) 结果:2
转换:
加括号: ((4-2)/(5-4))
移动操作符: ((4 2)-(5 4)-)/
去掉括号: 4 2-5 4-/
所以对应的波兰表达式为: 4 2-5 4-/
计算:
规则:从左至右扫描表达式。
1、遇到4,是操作数,入栈。
2、遇到2,是操作数,入栈。
3、遇到-,是操作符,从顶至下两元素出栈,底元素4-顶元素2得2,2入栈。
4、遇到5,是操作数,入栈。
5、遇到4,是操作数,入栈。
6、遇到-,是操作符,从顶至下两元素出栈,底元素5-顶元素4得1,1入栈。
7、遇到/,是操作符,从顶至下两元素出栈,底元素2/顶元素1得2。最后结果为2。