给一个用字符串表示的表达式数组,求出这个表达式的值。
注意事项
表达式只包含整数
, +
, -
, *
, /
, (
, )
.
样例
对于表达式 (2*6-(23+7)/(1+2))
, 对应的数组为:
[
"2", "*", "6", "-", "(",
"23", "+", "7", ")", "/",
"(", "1", "+", "2", ")"
],
其值为 2
class Solution {
public:
/*
* @param expression: a list of strings
* @return: an integer
*/
int evaluateExpression(vector<string> &expression) {
// write your code here
if (expression.size() == 0) {
return 0;
}
stack<char> operators;
stack<int> nums;
for (int i = 0; i < expression.size(); i++) {
if (expression[i][0] >= '0' && expression[i][0] <= '9') {
int num = 0;
for (int j = 0; j < expression[i].size(); j++) {
num = num*10 + expression[i][j] - '0';
}
nums.push(num);
} else {
char op = expression[i][0];
if (operators.empty()) {
operators.push(op);
} else if (op == '(') {
operators.push(op);
} else if (op == ')') {
while (operators.top() != '(') {
popAndExe(operators, nums);
}
operators.pop();
} else if (op == '+' || op == '-') {
char last_op = operators.top();
while (last_op == '+' || last_op == '-' || last_op == '*' || last_op == '/') {
popAndExe(operators, nums);
last_op = operators.empty() ? ' ' : operators.top();
}
operators.push(op);
} else if (op == '*' || op == '/') {
char last_op = operators.top();
while (last_op == '*' || last_op == '/') {
popAndExe(operators, nums);
last_op = operators.empty() ? ' ' : operators.top();
}
operators.push(op);
}
}
}
while (!operators.empty()) {
popAndExe(operators, nums);
}
return nums.top();
}
void popAndExe(stack<char>& operators, stack<int>& nums) {
int num2 = nums.top();
nums.pop();
int num1 = nums.top();
nums.pop();
char op = operators.top();
operators.pop();
nums.push(exe(num1, num2, op));
}
int exe(int num1, int num2, char op) {
int result = 0;
if (op == '+') {
result = num1 + num2;
} else if (op == '-') {
result = num1 - num2;
} else if (op == '*') {
result = num1 * num2;
} else if (op == '/') {
result = num1 / num2;
}
return result;
}
};