实现一个简单的计算器,在llvm和wiki上看见的算法
class Solution {
public:
Solution() {
pri['+'] = 1;
pri['-'] = 1;
pri['*'] = 2;
pri['/'] = 2;
pri['#'] = 0;
}
int calculate(string s) {
int index = 0;
if (s.size() == 0) {
return 0;
}
char lookahead = 0;
int lhs = getNum(s, index);
return parse(lookahead, s, index, lhs, '#');
}
private:
int parse(char& lookahead, const string& s, int& index, int lhs, char minOp) {
lookahead = peekOp(s, index);
while (lookahead != 0 && pri[lookahead] >= pri[minOp]) {
char op = lookahead;
getOp(s, index);
int rhs = getNum(s, index);
lookahead = peekOp(s, index);
while (lookahead != 0 && pri[lookahead] > pri[op]) {
rhs = parse(lookahead, s, index, rhs, lookahead);
}
lhs = compute(lhs, rhs, op);
}
return lhs;
}
map<char, int> pri;
int getNum(const string& s, int& index) {
while (index < s.size() && s[index] == ' ') {
++index;
}
if (index == s.size()) {
return -1;
}
int ret = 0;
while (index < s.size() && isdigit(s[index])) {
ret *= 10;
ret += s[index++] - '0';
}
return ret;
}
char getOp(const string&s, int& index) {
while (index < s.size() && s[index] == ' ') {
++index;
}
if (index == s.size() || isdigit(s[index])) {
return 0;
}
else {
return s[index++];
}
}
char peekOp(const string&s, int index) {
return getOp(s, index);
}
int compute(int lhs, int rhs, char op) {
switch (op) {
case '+': return lhs + rhs;
case '-': return lhs - rhs;
case '*': return lhs * rhs;
case '/': return lhs / rhs;
default: return 0;
}
}
};