考察栈的基本操作。之所以还要写这一篇,是因为Java中Stack类是继承Vector的,这是不合理的,栈当然不应该有按index取值的功能!在Stack类文档里有这句话:
A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For example:
Deque<Integer> stack = new ArrayDeque<Integer>();
意思是,当你想要使用真正意义上的栈时,使用Deque更合理,而非使用Stack。Deque是Interface类,所以需要new成其实现类ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList中的一种。最简单的就是LinkedList类。
贴代码:
import java.util.Deque;
import java.util.LinkedList;
import java.lang.Integer;
public class Solution {
public int evalRPN(String[] tokens) {
Deque<String> stack = new LinkedList<String>();
int len = tokens.length;
int i;
String token;
String one;
String two;
int result;
String three;
for (i=0;i<len;i++) {
token = tokens[i];
switch(token) {
case "+":
two = stack.removeLast();
one = stack.removeLast();
result = Integer.parseInt(one) + Integer.parseInt(two);
three = Integer.toString(result);
stack.addLast(three);
break;
case "-":
two = stack.removeLast();
one = stack.removeLast();
result = Integer.parseInt(one) - Integer.parseInt(two);
three = Integer.toString(result);
stack.addLast(three);
break;
case "*":
two = stack.removeLast();
one = stack.removeLast();
result = Integer.parseInt(one) * Integer.parseInt(two);
three = Integer.toString(result);
stack.addLast(three);
break;
case "/":
two = stack.removeLast();
one = stack.removeLast();
result = Integer.parseInt(one) / Integer.parseInt(two);
three = Integer.toString(result);
stack.addLast(three);
break;
default:
stack.addLast(token);
break;
}
}
three = stack.removeLast();
return Integer.parseInt(three);
}
}
《Java编程思想》7.8.4 有关final的忠告里说到Vector设计的缺陷,分别是它成员方法的final和synchronized关键字。其中,openjdk-7的Vector源码中,所有成员方法都不再有final关键字了,但几乎都还有synchronized关键字。
不知道是不是Oracle想遮掩什么,它的Vector文档里全部没有synchronized关键字!Java Platform SE 7和openjdk-7难道会不一致?Shit!