原题链接:https://leetcode.com/problems/basic-calculator/
Description
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.
Some examples:
“1 + 1 = 2”
“2-1 + 2 ” = 3
“(1+(4+5+2)-3)+(6+8)” = 23
Note: Do not use the eval built-in library function.
表达式计算。。
class ExpCalc {
private:
string ret;
stack<char> op;
stack<int> num;
inline void erase() {
ret = "";
while (!op.empty()) op.pop();
while (!num.empty()) num.pop();
}
inline int calc(int d1, int d2, char ch) {
int val = 0;
switch (ch) {
case '+': val = d1 + d2;
break;
case '-': val = d2 - d1;
break;
}
return val;
}
public:
ExpCalc() { erase(); }
~ExpCalc() { erase(); }
inline void InfixToPostfix(const string src) {
int n = src.length();
for (int i = 0; i < n;) {
if (' ' == src[i] || '=' == src[i]) { i++; continue; }
if ('(' == src[i]) op.push(src[i++]);
if (')' == src[i]) {
while (op.top() != '(') {
ret += op.top(); ret += ' ';
op.pop();
}
op.pop(); i++;
} else if ('-' == src[i] || '+' == src[i]) {
while (!op.empty() && ('-' == op.top() || '+' == op.top())) {
ret += op.top(); ret += ' ';
op.pop();
}
op.push(src[i++]);
} else {
while (isdigit(src[i])) {
ret += src[i++];
}
ret += ' ';
}
}
while (!op.empty()) {
ret += op.top(); ret += ' ';
op.pop();
}
ret += '=';
}
inline int PostfixCalc() {
int n = ret.length();
for (int i = 0; i < n;) {
if (' ' == ret[i] || '=' == ret[i]) { i++; continue; }
if ('-' == ret[i] || '+' == ret[i]) {
int d1 = num.top(); num.pop();
int d2 = num.top(); num.pop();
num.push(calc(d1, d2, ret[i++]));
} else if (isdigit(ret[i])) {
int x = 0;
while (isdigit(ret[i])) {
x = x * 10 + ret[i++] - '0';
}
num.push(x);
}
}
return num.top();
}
};
class Solution {
public:
int calculate(string s) {
if (s.empty()) return 0;
calc = new ExpCalc;
calc->InfixToPostfix(s);
int ans = calc->PostfixCalc();
return ans;
}
private:
ExpCalc *calc;
};