栈的应用-四则运算表达式
后缀(逆波兰)表示法定义:所有的符号都是在要运算数字的后面出现。
中缀表达式:a+b*c+(d*e+f)/g
后缀表达式:abc*+de*f+g/+
示例:2+3*2+(2*3+4)/2 = 13
232*+23*4+2/+ = 13
后缀表达式的运算:
1.扫描后缀表达式:
①如果是数字,则让其进栈
②若为操作符,则从栈中取出两个操作数,先取出的作为右操作数,后取出的作为左操作数,然后进行该操作符的运算,并使其结果入栈。
③重复上述过程,直至表达式扫描完成。
2.最终栈中只留一个元素—–>即就是结果。
中缀表达式转化成后缀表达式:
1.遇到操作数,直接输出;
2.栈为空时,遇到运算符,入栈;
3.遇到左括号,将其入栈;
4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
5.遇到其他运算符“+”、“-”、“*”、“÷”时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;
6.最终将栈中的元素依次出栈,输出。
示例:
例如将 9 + (3 - 1) X 3 + 10 / 2 转换成后缀表达式,过程如下:
1、9是数字,输出,表达式为:9;
2、“ + ”进栈,“ ( ”进栈,栈内容为:+ (;
3、数字3输出,表达式为:9 3;
4、“ - ”进栈,栈内容为:+ ( -;
5、数字1输出,表达式为:9 3 1;
6、遇到“ ) ”,根据规则,栈中符号出栈直到“ ( ”出栈为止,此间遇到“ - ”需要输出,因此表达式为:9 3 1 -,栈中内容为:+;
7、遇到“ X ”,由于它的优先级比栈顶元素“ + ”高,因此它进栈,栈中内容为:+ X;
8、遇到数字3输出,表达式为:9 3 1 - 3;
9、之后是“ + ”,优先级比栈顶的“ X ”低,“ X ”出栈输出,“ + ”变成栈顶,栈顶的“ + ”优先级并不大于外面的“ + ”,因此也需要出栈输出,此时栈为空了,那么表达式为:9 3 1 - 3 X +,同时外面的“ + ”进栈,栈中内容为:+;
10、遇到10输出,表达式为:9 3 1 - 3 X + 10;
11、遇到符号“ / ”,优先级比栈顶元素“ + ”高,进栈,栈中内容为:+ /;
12、数字2输出,表达式为:9 3 1 - 3 X + 10 2;
13、遍历结束,栈不为空,栈中符号依次出栈输出,最后表达式为:9 3 1 - 3 X + 10 2 / +。
1、9是数字,输出,表达式为:9;
2、“ + ”进栈,“ ( ”进栈,栈内容为:+ (;
3、数字3输出,表达式为:9 3;
4、“ - ”进栈,栈内容为:+ ( -;
5、数字1输出,表达式为:9 3 1;
6、遇到“ ) ”,根据规则,栈中符号出栈直到“ ( ”出栈为止,此间遇到“ - ”需要输出,因此表达式为:9 3 1 -,栈中内容为:+;
7、遇到“ X ”,由于它的优先级比栈顶元素“ + ”高,因此它进栈,栈中内容为:+ X;
8、遇到数字3输出,表达式为:9 3 1 - 3;
9、之后是“ + ”,优先级比栈顶的“ X ”低,“ X ”出栈输出,“ + ”变成栈顶,栈顶的“ + ”优先级并不大于外面的“ + ”,因此也需要出栈输出,此时栈为空了,那么表达式为:9 3 1 - 3 X +,同时外面的“ + ”进栈,栈中内容为:+;
10、遇到10输出,表达式为:9 3 1 - 3 X + 10;
11、遇到符号“ / ”,优先级比栈顶元素“ + ”高,进栈,栈中内容为:+ /;
12、数字2输出,表达式为:9 3 1 - 3 X + 10 2;
13、遍历结束,栈不为空,栈中符号依次出栈输出,最后表达式为:9 3 1 - 3 X + 10 2 / +。