题目:
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.
Example 1:
Input: "3+2*2"
Output: 7
Example 2:
Input: " 3/2 "
Output: 1
Example 3:
Input: " 3+5 / 2 "
Output: 5
Note:
- You may assume that the given expression is always valid.
- Do not use the
eval
built-in library function.
代码:
class Solution {
public:
int calculate(string s) {
int len = s.length();
stack<char> ops;
stack<int> nums;
for (int i = 0; i < len; i++) {
if (s[i] == ' ')continue;
if (isdigit(s[i])) {
string snum = "";
while (i < len && isdigit(s[i])) {
snum.push_back(s[i]);
i++;
}
i--;
int num = atoi(snum.c_str());
if (ops.empty()) { nums.push(num); continue; }
if (ops.top() == '*') {
ops.pop();
int a = nums.top(); nums.pop();
nums.push(num * a);
}
else if (ops.top() == '/') {
ops.pop();
int a = nums.top(); nums.pop();
nums.push(a / num);
}
else {
nums.push(num);
}
}
else {
if (s[i] == '+' || s[i] == '-') {
while (nums.size() > 1) {
char o = ops.top(); ops.pop();
int a = nums.top(); nums.pop();
int b = nums.top(); nums.pop();
if (o == '+') {
nums.push(a + b);
}
else {
nums.push(b - a);
}
}
}
ops.push(s[i]);
}
}
if (ops.empty())return nums.top();
else {
int a = nums.top(); nums.pop();
int b = nums.top(); nums.pop();
char c = ops.top(); ops.pop();
if (c == '+')return a + b;
else return b - a;
}
}
};
想法:
碰到加号,把之前的加减法都算了;
如果碰到一个数字,且这个数字前面的符号是乘除号,那么把这个数字和它前面乘除的元素的结果算了。