150.Evaluate Reverse Polish Notation---逆波兰式求值
题目大意:计算逆波兰表达式的值。
法一:stack,用stack存数,遇到操作符,则运算。代码如下(耗时12ms):
1 public int evalRPN(String[] tokens) { 2 Stack<Integer> s = new Stack<Integer>(); 3 for(int i = 0; i < tokens.length; i++) { 4 //如果是数值 5 if(!tokens[i].equals("+") && !tokens[i].equals("-") && !tokens[i].equals("*") && !tokens[i].equals("/")) { 6 s.push(Integer.parseInt(tokens[i])); 7 } 8 //如果是操作符 9 else { 10 int b = s.pop(); 11 int a = s.pop(); 12 int c = compute(a, b, tokens[i]); 13 s.push(c); 14 } 15 } 16 return s.pop(); 17 } 18 //运算 19 private static int compute(int a, int b, String s) { 20 if(s.equals("+")) { 21 return a + b; 22 } 23 else if(s.equals("-")) { 24 return a - b; 25 } 26 else if(s.equals("*")) { 27 return a * b; 28 } 29 else { 30 return a / b; 31 } 32 }
法二:stack+异常。很新颖的异常用法。代码如下(耗时70ms):
1 public int evalRPN(String[] tokens) { 2 Stack<Integer> s = new Stack<Integer>(); 3 for(int i = 0; i < tokens.length; i++) { 4 //捕捉异常,来辨别是数值还是操作符 5 try { 6 s.push(Integer.parseInt(tokens[i])); 7 } 8 catch(Exception e) { 9 int b = s.pop(); 10 int a = s.pop(); 11 int c = compute(a, b, tokens[i]); 12 s.push(c); 13 } 14 } 15 return s.pop(); 16 } 17 private static int compute(int a, int b, String s) { 18 if(s.equals("+")) { 19 return a + b; 20 } 21 else if(s.equals("-")) { 22 return a - b; 23 } 24 else if(s.equals("*")) { 25 return a * b; 26 } 27 else { 28 return a / b; 29 } 30 }