使用栈进行表达式求值的过程分析

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

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值