http://www.lintcode.com/zh-cn/problem/expression-evaluation/
给一个用字符串表示的表达式数组,求出这个表达式的值。
样例
对于表达式 (2*6-(23+7)/(1+2))
, 对应的数组为:
[
"2", "*", "6", "-", "(",
"23", "+", "7", ")", "/",
(", "1", "+", "2", ")"
],
其值为 2
思路:用两个栈分别保存操作数和操作符。每当遇到操作符时,进行检测,若操作符栈为空或栈顶元素的优先级比当前操作符低,直接入栈,否则弹出栈顶操作符和两个操作数计算,再把结果压入操作数栈中。继续检查,直至操作符栈为空或栈顶元素的优先级比当前操作符低
代码:
class Solution {
/**
* @param expression: an array of strings;
* @return: an integer
*/
public static int evaluateExpression(String[] expression) {
// write your code here
if(expression==null||expression.length==0)
return 0;
Stack<String> nums = new Stack<String>();
Stack<String> symbols = new Stack<String>();
String str=null;
for(int i=0;i<expression.length;++i){
str = expression[i];
if(str.equals("*")||str.equals("/")){
while(!symbols.empty()&&(symbols.peek().equals("/")||symbols.peek().equals("*")))
calc(nums,symbols);
symbols.push(str);
}else if(str.equals(")")){
while(!symbols.peek().equals("("))
calc(nums,symbols);
symbols.pop();
}else if(str.equals("+")||str.equals("-")){
while(!(symbols.empty()||symbols.peek().equals("(")))
calc(nums,symbols);
symbols.push(str);
}else if(str.equals("(")){
symbols.push("(");
}else{
nums.push(str);
}
}
while(!symbols.empty())
calc(nums,symbols);
if(nums.empty())
return 0;
else
return Integer.parseInt(nums.peek());
}
public static void calc(Stack<String> nums, Stack<String> symbols){
int left,right,result=0;
String str = null;
if(!symbols.empty()){
str = symbols.pop();
right = Integer.parseInt(nums.pop());
left = Integer.parseInt(nums.pop());
if(str.equals("+")){
result = right+left;
}else if(str.equals("-")){
result = left - right;
}else if(str.equals("*")){
result = right*left;
}else if(str.equals("/")){
result = left/right;
}
nums.push(String.valueOf(result));
}
}
};