问题:以逆波兰计数法计算算术表达式的值。
合法的操作符号:+, - ,*, /,(每个操作数可以是一个数字也可以是一个表达式)
例如:["2",''1","+","3","*"]->((2+1)*3))->9
1.直接的简单的解决方案:
这是一个简单的问题,在理解这个问题之后,我们很快就会想到可以运用栈的思想解决这个问题。我们将每个数字入栈,当遇见一个操作符的时候,将栈内的数字出栈和操作符一起计算,然后把计算的结果再入栈,如此下去,直到最终结果。
下面是代码,用一个小的测试来运行代码,但是,这段代码有编译的错误,什么原因呢?
public class Test {
public static void main(String[] args) throws IOException {
String[] tokens = new String[] { "2", "1", "+", "3", "*" };
System.out.println(evalRPN(tokens));
//System.out.println(longestPalindrome2("dabcba"));
}
public static int evalRPN(String[] tokens) {
int returnValue = 0;
String operators = "+-*/";
Stack<String> stack = new Stack<String>();
for(String t : tokens){
if(!operators.contains(t)){
stack.push(t);
}else{
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
switch(t){
case "+":
stack.push(String.valueOf(a+b));
break;
case "-":
stack.push(String.valueOf(b-a));
break;
case "*":
stack.push(String.valueOf(a*b));
break;
case "/":
stack.push(String.valueOf(b/a));
break;
}
}
}
returnValue = Integer.valueOf(stack.pop());
return returnValue;
}
}
2.可行的方案:如果你想用switch语句,你需要将上面的字符串"+,-,*,/"转换成用他们的索引值,如下面的代码。
public static void main(String[] args) throws IOException {
String[] tokens = new String[] { "2", "1", "+", "3", "*" };
System.out.println(evalRPN(tokens));
//System.out.println(longestPalindrome2("dabcba"));
}
public static int evalRPN(String[] tokens) {
int returnValue = 0;
String operators = "+-*/";
Stack<String> stack = new Stack<String>();
for(String t : tokens){
if(!operators.contains(t)){
stack.push(t);
}else{
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
int index = operators.indexOf(t);
switch(index){
case 0:
stack.push(String.valueOf(a+b));
break;
case 1:
stack.push(String.valueOf(b-a));
break;
case 2:
stack.push(String.valueOf(a*b));
break;
case 3:
stack.push(String.valueOf(b/a));
break;
}
}
}
returnValue = Integer.valueOf(stack.pop());
return returnValue;
}
}