栈的应用十分广泛,只要满足先进后出的特性就可以使用栈结构,表达式求值就是其中一个简单应用,下面以四则运算来举例说明:
1、中缀表达式 转换为 后缀表达式
-
中缀表达式
指运算符在两个运算对象之间,比如 23+(34*45)/(5+6+7) -
后缀表达式
指不含括号,运算符在两个参与运算的语法成分后面,按照后缀表达式求值时,所有的求值计算皆按运算符出现的顺序,严格从左至右执行,比如 23 34 45 * 5 6 + 7 + / +转换方法:从左到右扫描中缀表达式,用栈存放表达式中的操作数、运算符、开括号以及在此开括号后暂不确定计算次序的其他运算符:
(1)当输入的是操作数时,直接输出到后缀表达式序列;
(2)当输入的是运算符时:
①判断是否 栈非空 and 栈顶运算符的优先级不低于输入运算的符优先级,如果为真则将栈顶元素弹出,放到后缀表达式序列中;
②将输入的运算符压入栈内;
(3)当输入的是括号时:
①遇到开括号,把它压入栈;
②遇到闭括号,把栈中元素依次弹出到后缀表达式序列,直到遇到第一个开括号为⽌,括号舍弃,不放入后缀表达式序列;
(4)当中缀表达式的元素全部读入时,若栈内仍有元素,全部依次弹出到后缀表达式序列。
1. 栈:null 后缀表达式序列:23
2. 栈:+ 后缀表达式序列:23
3. 栈:+ ( 后缀表达式序列:23
4. 栈:+ ( 后缀表达式序列:23 34
5. 栈:+ ( * 后缀表达式序列:23 34
6. 栈:+ ( * 后缀表达式序列:23 34 45
7. 栈:+ 后缀表达式序列:23 34 45 *
8. 栈:+ / 后缀表达式序列:23 34 45 *
9. 栈:+ / ( 后缀表达式序列:23 34 45 *
10. 栈:+ / ( 后缀表达式序列:23 34 45 * 5
11. 栈:+ / ( + 后缀表达式序列:23 34 45 * 5
12. 栈:+ / ( + 后缀表达式序列:23 34 45 * 5 6
13. 栈:+ / ( + 后缀表达式序列:23 34 45 * 5 6 +
14. 栈:+ / ( + 后缀表达式序列:23 34 45 * 5 6 + 7
15. 栈:null 后缀表达式序列:23 34 45 * 5 6 + 7 + / +
2、后缀表达式求值
(1)遇到操作数,压入栈中;
(2)遇到运算符,从栈中弹出两个操作数进行运算后将结果压入栈中
1、 后缀表达式序列: 23 34 45 * 5 6 + 7 + / + 栈:null
2、 后缀表达式序列: 34 45 * 5 6 + 7 + / + 栈:23
3、 后缀表达式序列: 45 * 5 6 + 7 + / + 栈:23 34
4、 后缀表达式序列: * 5 6 + 7 + / + 栈:23 34 45
5、 后缀表达式序列: 5 6 + 7 + / + 栈:23 1530
6、 后缀表达式序列: 6 + 7 + / + 栈:23 1530 5
7、 后缀表达式序列: + 7 + / + 栈:23 1530 5 6
8、 后缀表达式序列: 7 + / + 栈:23 1530 11
9、 后缀表达式序列: + / + 栈:23 1530 11 7
10、后缀表达式序列: / + 栈:23 1530 18
11、后缀表达式序列: + 栈:23 85
12、后缀表达式序列: null 栈:108