栈
表达式解析
leetcode 1006
逆波兰表达式需要维护数字和操作符两个栈,这题由于操作符顺序是固定的,可以不用操作符栈。
题目乘法和除法是连在一起算的,加法是单独算的,减法减去的值总是乘除的结果,模拟一下即可。
需要注意除法的负数取值。
leetcode 394
可以dfs也可以用栈迭代模拟,新学了这种dfs的方法叫递归下降解析,“下降”指的是我们从最高层级,一层层往下去匹配,是用来处理嵌套解析的一种方式。
特点是维护全局index,相比每次都去搜索匹配右括号(O(n^2)),这种全局index扫描的方法因为每个字符只被处理一次,所以保证了O(n)的线性时间复杂度,效率最高。
注意如果遇到终止符(本题是']')需要立刻返回避免递归在内层死循环,由外层控制跳过终止符(全局index+1)。
leetcode 224
用递归下降解析或者单栈(因为没有优先级问题)都可以,单栈会简单一点,递归下降解析处理纯嵌套问题还行,处理计算问题不太直观。
带括号加减乘除(运算有优先级)问题的统一直观解法是双栈,一个存数字一个存运算符,处理优先级的核心步骤是:如果当前字符优先级低于栈顶元素,则用栈顶元素计算,计算完再把当前符号入栈,这样保证优先级高的运算先做完。
注意处理开头为负数的情况,分两种:
1、字符串开头是负数,前面加0
2、括号里开头是负数,前面加0
leetcode 227
简化版四则运算,没有括号的情况,用上面双栈的思路非常简单。
leetcode 772
加括号的完整四则运算,括号处理方法是左括号无条件入符号栈,遇到右括号持续计算直到左括号出栈。