您的位置:首页 > 编程语言 > Lua

Lintcode - Expression Evaluation

2015-07-05 15:28 218 查看
转自 : http://blog.csdn.net/nicaishibiantai/article/details/45740649



Given an expression string array, return the final result of this expression

Example

For the expression
2*6-(23+7)/(1+2)
,
input is
[
"2", "*", "6", "-", "(",
"23", "+", "7", ")", "/",
(", "1", "+", "2", ")"
],

return
2


Note

The expression contains only
integer
,
+
,
-
,
*
,
/
,
(
,
)
.
一个很详细的解释:http://www.geeksforgeeks.org/expression-evaluation/ 比这道题还难点
思路就是两个stack,一个存数字一个存符号。如果遇到数字直接存到数字stack;如果遇到符号,有几种情况:
1.当前符号比上一个符号优先级高,比如* 高于+,那么直接进栈
2.当前符号低于上一个,那么就要把所有已经在stack里面优先于当前符号的全算完,再推进当前符号
3.当前符号是“(”,直接push
4.当前符号是“)”,就要把所有“(”以前的符号全部算完

public class Solution {
/**
* @param expression: an array of strings;
* @return: an integer
*/
public int evaluateExpression(String[] expression) {
// write your code here
Stack<Integer> intStack = new Stack<Integer>();
Stack<String> opStack = new Stack<String>();

int cur = 0;
while (cur < expression.length) {
String curStr = expression[cur];
if (isOp(curStr)) {
if (curStr.equals("(")) {
opStack.push(curStr);
} else if (curStr.equals(")")) {
while (!opStack.peek().equals("(")) {
intStack.push(calc(intStack.pop(), intStack.pop(), opStack.pop()));
}
opStack.pop();
} else {
while (!opStack.isEmpty() && precedence(curStr, opStack.peek())) {
intStack.push(calc(intStack.pop(), intStack.pop(), opStack.pop()));
}
opStack.push(curStr);
}
} else {
intStack.push(Integer.valueOf(curStr));
}
cur++;
}

while (!opStack.isEmpty()) {
intStack.push(calc(intStack.pop(), intStack.pop(), opStack.pop()));
}
return intStack.isEmpty() ? 0 : intStack.pop();
}

int calc(int a, int b, String op) {
if (op.equals("+")) {
return a + b;
} else if (op.equals("-")) {
return b - a;
} else if (op.equals("*")) {
return a * b;
} else {
return b/a;
}
}

boolean isOp(String str) {
if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")
|| str.equals("(") || str.equals(")")) {
return true;
} else {
return false;
}
}

// if b takes precedence over a
boolean precedence(String a, String b) {
if (b.equals("*") || b.equals("/")) {
return true;
}
if (b.equals("+") || b.equals("-")) {
if(a.equals("*") || a.equals("/")) {
return false;
} else {
return true;
}
}
return false;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: