稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

表达式求值问题总结

在模拟范畴内表达式运算求值是比较典型的一类问题,而且是较难的一类题,细节非常多,数组结构一般只用到栈,需要积累一定的技巧以简化逻辑。

问题分类

表达式类问题一般输入都是以字串形式,所以第一个要点就是把一个字符串按语义拆解为符号,操作符和操作数。

第二个要点就是表达式的运算。

形式上又可分为后缀式和中缀式(也即正常顺序)。

操作符有些是只有加减法,有些则四则运算都有,这个会让难度上一个层次。

最难搞的就是括号,如果有括号的话,会让难度直接上一个数量级。

绝大多数场景都要用到栈,对于复杂的运算(四则)和有括号,因为涉及优先级和嵌套,所以要用到双栈,一个栈存操作符,一个栈存操作数。

要点分析

第一步就是拆解字串,把其分解成为操作符,符号操作数。在拆解的时候最重要的就是当遇到某一个类型分类时,要把它当成一个整体全都解析出来,直到遇到不同类别的字符。比如说『-234+5』这样一个字串,第一个是符号,它不能单独存在,必须与其后的数字组合起来,这一坨直到加号『+』为止,是一个整体操作数-234

符号一般只出现在字符串的开头,具体的就是整个字串的第1个字符,以及等号右边的第1个字符(如果有等号的话)。

后缀表达式

也称作逆波兰表达式,它形式上与人的直觉不一致,但,是表达式中最容易解决的一类。它是把操作数写在前面,操作符号写在后面。

解决方法是第一步先把字符串分解为操作数和操作符,然后用一个栈就可以解决。遇到操作数就入栈,遇到操作符就弹出栈顶的两个操作数进行计算,结果再入栈,直到遍历完成。

典型问题

题目 题解 说明
150. 逆波兰表达式求值 题解 栈的基本运用

中缀表达式

这也是符合人类思维的表达式,操作数写在操作符的两边。表达 式类问题以这类居多,因为后缀式规则 明确操作单一,规则和套路都是固定的。

但中缀式则不然,可以有四则运算,还可以加括号,甚至还可以加自定义运算符,还可以解方程等等。

中缀表达式的解法,有两种,一是转成后缀式,但只有基本的表达式方便转,如果有高级别的操作符时,以及有括号时,转换很难;二是用双栈法,这也是比较好的一种解决办法,一个栈用于存放操作数,另一个栈用于存放操作符。

典型问题

题目 题解 说明
224. 基本计算器 题解 双栈大法
227. 基本计算器 II 题解
241. 为运算表达式设计优先级 题解
282. 给表达式添加运算符 题解 回溯
770. 基本计算器 IV 题解
772. 基本计算器 III 题解 有锁要会员
题解

方程

方程是比较复杂的一类表达式,它最大的特点是表达式中有等号。需要用表达式求值的方法来合并同类项,最终化成一元一次方程或者一元二次方程,然后再去解方程。

与方程类似的还有分数运算,分数涉及约分,用最大公约数和最小公倍数来约分,然后也会转化为方程。

典型问题

题目 题解 说明
592. 分数加减运算 题解
640. 求解方程 题解
题解
题解

参考资料

Comments