在模拟范畴内表达式运算求值是比较典型的一类问题,而且是较难的一类题,细节非常多,数组结构一般只用到栈,需要积累一定的技巧以简化逻辑。
问题分类
表达式类问题一般输入都是以字串形式,所以第一个要点就是把一个字符串按语义拆解为符号,操作符和操作数。
第二个要点就是表达式的运算。
形式上又可分为后缀式和中缀式(也即正常顺序)。
操作符有些是只有加减法,有些则四则运算都有,这个会让难度上一个层次。
最难搞的就是括号,如果有括号的话,会让难度直接上一个数量级。
绝大多数场景都要用到栈,对于复杂的运算(四则)和有括号,因为涉及优先级和嵌套,所以要用到双栈,一个栈存操作符,一个栈存操作数。
要点分析
第一步就是拆解字串,把其分解成为操作符,符号和操作数。在拆解的时候最重要的就是当遇到某一个类型分类时,要把它当成一个整体全都解析出来,直到遇到不同类别的字符。比如说『-234+5』这样一个字串,第一个是符号,它不能单独存在,必须与其后的数字组合起来,这一坨直到加号『+』为止,是一个整体操作数-234。
符号一般只出现在字符串的开头,具体的就是整个字串的第1个字符,以及等号右边的第1个字符(如果有等号的话)。
后缀表达式
也称作逆波兰表达式,它形式上与人的直觉不一致,但,是表达式中最容易解决的一类。它是把操作数写在前面,操作符号写在后面。
解决方法是第一步先把字符串分解为操作数和操作符,然后用一个栈就可以解决。遇到操作数就入栈,遇到操作符就弹出栈顶的两个操作数进行计算,结果再入栈,直到遍历完成。
典型问题
题目 | 题解 | 说明 |
---|---|---|
150. 逆波兰表达式求值 | 题解 | 栈的基本运用 |
中缀表达式
这也是符合人类思维的表达式,操作数写在操作符的两边。表达 式类问题以这类居多,因为后缀式规则 明确操作单一,规则和套路都是固定的。
但中缀式则不然,可以有四则运算,还可以加括号,甚至还可以加自定义运算符,还可以解方程等等。
中缀表达式的解法,有两种,一是转成后缀式,但只有基本的表达式方便转,如果有高级别的操作符时,以及有括号时,转换很难;二是用双栈法,这也是比较好的一种解决办法,一个栈用于存放操作数,另一个栈用于存放操作符。
典型问题
题目 | 题解 | 说明 |
---|---|---|
224. 基本计算器 | 题解 | 双栈大法 |
227. 基本计算器 II | 题解 | |
241. 为运算表达式设计优先级 | 题解 | |
282. 给表达式添加运算符 | 题解 | 回溯 |
770. 基本计算器 IV | 题解 | |
772. 基本计算器 III | 题解 | 有锁要会员 |
题解 |
方程
方程是比较复杂的一类表达式,它最大的特点是表达式中有等号。需要用表达式求值的方法来合并同类项,最终化成一元一次方程或者一元二次方程,然后再去解方程。
与方程类似的还有分数运算,分数涉及约分,用最大公约数和最小公倍数来约分,然后也会转化为方程。
典型问题
题目 | 题解 | 说明 |
---|---|---|
592. 分数加减运算 | 题解 | |
640. 求解方程 | 题解 | |
题解 | ||
题解 |