From : https://leetcode.com/problems/basic-calculator-ii/
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
Note: Do not use the eval
built-in library function.
Solution 1:
先计算所有乘除法,再计算加减法。
class Solution {
public:
int md(int left, char options, int right) {
switch(options) {
case '*': return left * right;
case '/': return left / right;
default : return 0;
}
}
int calculate(string s) {
int n = s.length();
if (n < 1) return 0;
int result = 0;
stack<int> value;
stack<char> options;
options.push('+'); //这样才能取出第一个用于加法的数字
for (int i = 0; i < n;) {
if (s[i] == ' ') i++;
else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
options.push(s[i]);
i++;
} else {
int right = 0;
while(i < n && s[i] <= '9' && s[i] >= '0') {
right = right*10 + s[i]-'0';
i++;
}
if (!options.empty() && (options.top() == '*' || options.top() == '/')) {
right = md(value.top(), options.top(), right);
value.pop();
options.pop();
}
value.push(right);
}
}
while (!options.empty()) {
int temp = value.top();
if (options.top() == '-') temp = -temp;
result += temp;
value.pop();
options.pop();
}
return result;
}
};
Solution 2:
直接计算,节省空间。
class Solution {
public:
int calculate(string s) {
s = "0+0+0+"+s;
int a=0, b=0, c=0, ans=0;
char op1='+', op2='+';
for(int i=5; op1!='.';) {
if(op2!='.' && op1=='*' || op1=='/') {
if(op1 == '*') {
a *= b;
} else {
a /= b;
}
b = c;
op1 = op2;
} else if(op2=='*' || op2=='/') {
if(op2 == '*') {
b *= c;
} else {
b /= c;
}
} else {
if(op1 == '+') {
a += b;
} else if(op1 == '-'){
a -= b;
} else if(op1 == '*') {
a *= b;
} else {
a /= b;
}
b = c;
op1 = op2;
}
findNext(s, i, op2, c);
}
return a;
}
void findNext(string& s, int &i, char& op, int &n) {
op = '.';
n = -1;
for(int len=s.size(); i<len; i++) {
if(s[i] != ' ') {
if(s[i]>='0' && s[i]<='9') {
n = 0;
while(i<len && (s[i]==' ' || s[i]>='0' && s[i]<='9')) {
if(s[i] != ' ') n = n*10+s[i]-'0';
i++;
}
if(i<len && op=='.') {
op=s[i];
i++;
}
} else {
if(i < len) op = s[i];
}
}
if(n != -1 && op != '.') break;
}
}
};