问题
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
例子
"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23
分析
使用栈来保存临时的计算结果和符号。
遍历字符串,根据当前字符的不同,分别进行如下处理:
- 数字位:即当前字符为'0'-'9'这十个数字之间,用该字符更新当前数字的大小;
- '+'或'-':说明数字已经结束,把当前的数字加或减到当前结果上,更新符号,并把当前数字置为0;
- '(':把当前结果和符号压入栈中,并把当前结果置为0;
- ')':说明数字已经结束,把当前的数字加或减到当前结果上,并让以前的符号和符号和结果出栈,把当前的结果加或减到以前结果上。把当前数字置为0。
要点
遇到'('时,将当前结果和符号入栈;遇到')'时,让以前的符号和结果出栈。
时间复杂度
O(n)
空间复杂度
O(1)
代码
class Solution {
public:
int calculate(string s) {
stack<int> es;
int res = 0, sign = 1, num = 0;
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (c >= '0' && c <= '9') {
num = num * 10 + c - '0';
}
else if (c == '+' || c == '-') {
res += sign * num;
sign = c == '+' ? 1 : -1;
num = 0;
}
else if (c == '(') {
es.push(res);
es.push(sign);
res = 0;
sign = 1;
}
else if (c == ')') {
res += sign * num;
res *= es.top(); es.pop();
res += es.top(); es.pop();
num = 0;
}
}
// 处理没有括号的情况,例如1 1-100
if (num != 0) res += sign * num;
return res;
}
};