Stack算法题的思考
Stack 算法题的思考
这类题目也是比较多的,一般比较繁琐。思路类似DFS,不过可以不使用递归实现。
String 解析类
这类比较多的就是计算器,以及分析括号里的内容。例如解析 3[a]2[bc]
,这时候就可以在遇到[
的时候把之前的东西都压到栈里,之后当遇到]
的时候把内容再pop出来。
对于计算器,如果是后缀表达式的话,可以把结果都压到栈里,遇到运算符再pop出运算。有括号的话还是按括号的方法,主要要注意加法和乘法的区别。
计算器系列最重要的思想就是前一个符号看作大小的指示,之后那个才用来做计算。例如(1+2)+(3+4)
, +可以看作是是后一个括号的符号。对于1*2 + 6/3,原理相同。在进行+6/3的时候,先把sign变成+6,并进行除法标记。之后再用除法。
- 150. Evaluate Reverse Polish Notation
- 385. Mini Parser
- 394. Decode String
- 726. Number of Atoms
- 224. Basic Calculator
- 227. Basic Calculator II
- 770. Basic Calculator IV
- 772. Basic Calculator III
大小差距
还有一类题目就是问下一个比自己大的数还有多远,可以使用栈。栈里面存的都是比栈顶小的数,遇到比栈顶大的数n就可以弹出栈里的数j,因为这时我们可以知道比之前那个数j大的数在n了,更新之前那个数j的结果。
栈的作用存一个至今遇到的大值。栈底是最大的值,栈顶是至今遇到的大值里最小的。
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
int idx = stack.pop();
res[idx] = i - idx;
}
stack.push(i);
}
//保存自己是最低的边界
for (int i = 0; i < N; ++i) {
while (!stack.isEmpty() && A[i] <= A[stack.peek()])
stack.pop();
prev[i] = stack.isEmpty() ? -1 : stack.peek();
stack.push(i);
}