Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +
, -
, *
, /
operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
"3+2*2" = 7 " 3/2 " = 1 " 3+5 / 2 " = 5
别人优秀的代码:
1.这个代码简洁,其中44 - op
代表 op == '+' ? 1 : -1。
同时,>>能跳过空格
int calculate(string s) { istringstream in('+' + s + '+'); long long total = 0, term = 0, n; char op; while (in >> op) { if (op == '+' or op == '-') { total += term; in >> term; term *= 44 - op; } else { in >> n; if (op == '*') term *= n; else term /= n; } } return total; }
int calculate(string s) { int result = 0, cur_res = 0; char op = '+'; for(int pos = s.find_first_not_of(' '); pos < s.size(); pos = s.find_first_not_of(' ', pos)) { if(isdigit(s[pos])) { int tmp = s[pos] - '0'; while(++pos < s.size() && isdigit(s[pos])) tmp = tmp*10 + (s[pos] - '0'); switch(op) { case '+' : cur_res += tmp; break; case '-' : cur_res -= tmp; break; case '*' : cur_res *= tmp; break; case '/' : cur_res /= tmp; break; } } else { if(s[pos] == '+' || s[pos] == '-') { result += cur_res; cur_res = 0; } op = s[pos++]; } } return result + cur_res; }
3.这个用栈的也是很简单的方法
int calculate(string s) { stack<int> myStack; char sign = '+'; int res = 0, tmp = 0; for (unsigned int i = 0; i < s.size(); i++) { if (isdigit(s[i])) tmp = 10*tmp + s[i]-'0'; if (!isdigit(s[i]) && !isspace(s[i]) || i == s.size()-1) { if (sign == '-') myStack.push(-tmp); else if (sign == '+') myStack.push(tmp); else { int num; if (sign == '*' ) num = myStack.top()*tmp; else num = myStack.top()/tmp; myStack.pop(); myStack.push(num); } sign = s[i]; tmp = 0; } } while (!myStack.empty()) { res += myStack.top(); myStack.pop(); } return res; }