Stack
应用场景
任何需要记住最近一步运算结果的场景。
使用技巧
掌握好两个操作,入栈与出栈。
1。入栈,通常是为了保存之前的运算结果,即已经完成了运算的一些节点。 For example,binary tree pre-order traversal,栈里存的就是已经遍历过当前节点和左子树的所有节点,出栈的时候只需要判断右子树即可。
2。出栈,通常是为了进行新的计算。
经典题目
150 Evaluate Reverse Polish Notation
栈的经典题之一。每次遇到操作符,从栈中pop 头两个数字;每次遇到数字,直接进栈。
public int evalRPN(String[] tokens) {
Deque<Integer> numbers = new LinkedList<>();
for (String cur: tokens) {
if (cur.equals("+")) {
int first = numbers.pollLast();
int second = numbers.pollLast();
numbers.add(first + second);
} else if (cur.equals("-")) {
int first = numbers.pollLast();
int second = numbers.pollLast();
numbers.add(second - first);
} else if (cur.equals("*")) {
int first = numbers.pollLast();
int second = numbers.pollLast();
numbers.add(first * second);
} else if (cur.equals("/")) {
int first = numbers.pollLast();
int second = numbers.pollLast();
numbers.add(second / first);
} else {
numbers.add(Integer.valueOf(cur));
}
}
return numbers.pollLast();
}很明显,要用Stack做。这题的难点在于,运算有加减法,优先级的话得先计算括号里的数。 这里用3个变量,res代表目前括号里的目前结果,number代表目前的数,sign代表上一个符号。
Last updated