Basic Calculator II
class Solution {
public:
int calculate(string s) {
vector<string> degrees;
unordered_map<char, function<int(int, int)>> plusMinus;
unordered_map<char, function<int(int, int)>> mulDiv;
plusMinus['+'] = [](int a, int b) { return a + b; };
plusMinus['-'] = [](int a, int b) { return a - b; };
mulDiv['*'] = [](int a, int b) { return a * b; };
mulDiv['/'] = [](int a, int b) { return a / b; };
for (auto it = s.begin(); it != s.end(); it++) {
char letter = *it;
if ('0' <= letter && letter <= '9') {
degrees.push_back(parseNum(s, it));
} else if (mulDiv.find(letter) != mulDiv.end()) {
degrees.back() = to_string(mulDiv[letter](stoi(degrees.back()), stoi(parseNum(s, it))));
} else if (plusMinus.find(letter) != plusMinus.end()) {
string op = " ";
op.at(0) = letter;
degrees.push_back(op);
}
}
int res = 0;
char prevOp = '+';
for (auto °ree: degrees) {
if (plusMinus.find(degree.at(0)) != plusMinus.end()) {
prevOp = degree.at(0);
} else {
res = plusMinus[prevOp](res, stoi(degree));
}
}
return res;
}
string parseNum(string &s, string::iterator &it) {
string numString = "";
while (*it < '0' || *it > '9') {
it++;
}
for (; next(it) != s.end() && *next(it) >= '0' && *next(it) <= '9'; it++) {
numString += *it;
}
numString += *it;
return numString;
}
};