【转】表达式求值的操作过程(栈)

转自:https://blog.csdn.net/weixin_43759761/article/details/84930053

栈的应用十分广泛,只要满足先进后出的特性就可以使用栈结构,表达式求值就是其中一个简单应用,下面以四则运算来举例说明:

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

  

posted on 2020-06-07 16:19  丶柔情水月潇湘梦  阅读(434)  评论(0)    收藏  举报

导航