前提优先级:
其一: *、/、% > +、-
其二:当栈内和栈外操作符等级相同时,默认栈内优先级较高
其三:括号的优先级:左括号 ’ ( ’ 入栈前优先级贼高,入栈后贼低。右括号’)'一经遍历就将栈内与其对应的‘(’到栈顶的操作符全部出栈并输出非括号的操作符。
转换规则如下:(一般会先给操作符栈中入栈一个’#‘,这里就不入了)
1.对中缀表达式从前往后遍历
2.当遍历到操作数时直接输出
3.当遍历到操作符时,遵循如下规律
i)当所遍历到的操作符优先级比栈顶操作符优先级高时,直接将当前遍历到的操作符入栈,否则将栈顶操作符出栈输出,并继续比较。
ii)当遍历到操作符’(‘时,直接入栈,当遍历到’)‘时,将栈顶操作符至栈内最上的’('之间全部操作符出栈并输出非括号的操作符。
实例如下:
将中缀表达式:A+B*(C-D)-E/F 转换
1.遍历到A,直接输出。输出内容:A ; 栈中内容:空
2.遍历到+,入栈。输出内容:A;栈中内容:+;
3.遍历到B,直接输出。输出内容:AB;栈中内容:+;
4.遍历到(,直接入栈。输出内容:AB;栈中内容:+、(;
5.遍历到C,直接输出。输出内容:ABC;栈中内容:+、(;
6遍历到 -,比较 - 与栈顶符号即(,此时 -优先级较高,直接入栈。输出内容:ABC;栈中内容: +、(、-;
7.遍历到D,直接输出。输出内容:ABCD;栈内内容: +、(、-;
8.遍历到 ),把栈中最近的( 到栈顶的操作符全部输出。输出内容:ABCD-;栈中内容:+;
9.遍历到 -,比较 -与栈顶 +,+优先级较高,出栈并输出+,继续比较发现栈底了直接入栈 -,输出内容:ABCD-+;栈中内容: - ;
10.遍历到E,直接输出。输出内容:ABCD-+E;栈中内容: - ;
11.遍历到/,比较 / 与栈顶操作符 - ,/优先级较高,直接入栈。输出内容:ABCD-+E;栈中内容: - 、/;
12.遍历到F,直接输出。输出内容:ABCD-+EF;栈中内容: - 、/;
13.遍历结束,依次将栈中剩余操作符输出。输出内容:ABCD-+EF/-;栈中内容: 空。
输出的内容也就是对应的后缀表达式。