前言
什么是中缀、后缀表达式?还有个前缀表达式。自行百度。这里主要说一说中缀怎么转后缀表达式,以及怎样根据后缀表达式求值。
中缀转后缀
方法有二。
其一:规则法
1、中缀表达式从左到右依次扫描,遇到操作数,直接输出;
2、遇到操作符需要判断(另:正负号应算入操作数):
2.1、'('左括号:直接入栈;
2.2、')'右括号:依次把栈中的运算符输出,直到出现左括号。将左括号从栈中删除,右括号则丢弃。
2.3、如果是其他运算符:判断当前扫描到的运算符和栈顶元素的优先级('*、/'为 2,'+、-'为1,'('为0,其他为-1)。如果当前运算符优先级较高,则直接入栈,否则,依次输出比当前运算符优先级高或相等的运算符,直到遇到不符合条件的元素或者遇到左括号为止,再将当前运算符入栈。
3、扫描结束后,如果运算符存放栈还有元素,则依次输出。
举例:1*3+((2+4)/3+6)
1输出 | 结果:1 | 运算符存放栈: |
*入栈 | 结果:1 | 运算符存放栈:* |
3输出 | 结果:1 3 | 运算符存放栈:* |
*出栈,+入栈 | 结果:1 3 * | 运算符存放栈:+ |
(入栈 | 结果:1 3 * | 运算符存放栈:+( |
(入栈 | 结果:1 3 * | 运算符存放栈:+(( |
2输出 | 结果:1 3 * 2 | 运算符存放栈:+(( |
+入栈 | 结果:1 3 * 2 | 运算符存放栈:+((+ |
4输出 | 结果:1 3 * 2 4 | 运算符存放栈:+((+ |
+出栈,(删除,)丢弃 | 结果:1 3 * 2 4 + | 运算符存放栈:+( |
/入栈 | 结果:1 3 * 2 4 + | 运算符存放栈:+(/ |
3输出 | 结果:1 3 * 2 4 + 3 | 运算符存放栈:+(/ |
/出栈,+入栈 | 结果:1 3 * 2 4 + 3 / | 运算符存放栈:+(+ |
6输出 | 结果:1 3 * 2 4 + 3 / 6 | 运算符存放栈:+(+ |
+出栈,(删除,)丢弃 | 结果:1 3 * 2 4 + 3 / 6 + | 运算符存放栈:+ |
+出栈 | 结果:1 3 * 2 4 + 3 / 6 + + | 运算符存放栈: |
其二:括号法
1、先按照运算符的优先级对中缀表达式加括号,得 (1*3)+((((2+4)/3)+6)) ;
2、将运算符移到括号的后面,得 (13)*((((24)+3)/6)+)+ ;
3、去掉括号,得 13*24+3/6++ 。
后缀表达式求值
1、遍历后缀表达式,遇到操作数就入栈;
2、遇到操作符,就pop两个栈中元素,进行计算,结果再压入栈中。直至得出最终结果。
思想有了,代码就有了~~
详见中缀与后缀表达式–代码篇