如何用栈计算一个算术表达式的值?

例如

    1+2×(3+4)

基本思路

    括号内的式子作为子表达式,递归的分解为普通表达式 普通表达式只有2个优先级,+-为0,×÷为0.5 进入括号时,括号对应的这一层运算符的优先级基础值赋值为左括号左边一个运算符的优先级+1 运算符的优先级=括号层数base+4个运算符(+-×÷)自身的优先级offset
设初始优先级为0,那么, 设初始优先级为0,那么,
第1个+的优先级为0+0, 第1个+的优先级为0+0,
×的优先级为0+0.5, ×的优先级为0+0.5,
第2个+的优先级为1+0, 第2个+的优先级为1+0,
在确定优先级之后,可以想一想我们在人工计算表达式值的时候是怎么算的 在确定优先级之后,可以想一想我们在人工计算表达式值的时候是怎么算的
(思考过程暂时略过) (思考过程暂时略过)
首先把数字和运算符压栈,直到栈中有1个运算符为止,记此运算符为sp-1,此时再看下一个运算符sp+1 首先把数字和运算符压栈,直到栈中有1个运算符为止,记此运算符为sp-1,此时再看下一个运算符sp+1
如果sp-1的优先级比sp+1的大,那么可以抢先运算(把栈顶的1个运算符和2个操作数进行计算,求出结果,然后弹出栈顶的3个元素,压入结果),而不用管之后的其他运算符的优先级 如果sp-1的优先级比sp+1的大,那么可以抢先运算(把栈顶的1个运算符和2个操作数进行计算,求出结果,然后弹出栈顶的3个元素,压入结果),而不用管之后的其他运算符的优先级
说白了,就是先把遇到的第一个右括号那一层的表达式先求值,而括号内按照4个运算符(+-×÷)优先级来运算 说白了,就是先把遇到的第一个右括号那一层的表达式先求值,而括号内按照4个运算符(+-×÷)优先级来运算
顺便一提,可以把这种解析过程看成是对这个表达式树的解析,那么求值就是对这棵多叉树进行后序遍历(左右根) 顺便一提,可以把这种解析过程看成是对这个表达式树的解析,那么求值就是对这棵多叉树进行后序遍历(左右根)
经验分享 程序员 微信小程序 职场和发展