1. 解析
题目大意,从运算操作字符串中计算最终的结果
2. 分析
要考虑以下几个问题即可:
①运算符的优先级:'*'和'/'的优先级最高
② 计算结果的存储:依次压入栈中
③何时进行计算:当出现优先级低的时候进行运算
class Solution {
public:
int calculate(string s) {
stack<int> nums;
stack<char> op;
for (int pos = 0; pos < s.length(); ++pos){
if (s[pos] == ' ') continue;
if (s[pos] == '+' || s[pos] == '-' || s[pos] == '*' || s[pos] == '/'){
while (! op.empty() && prior_cmp(op.top(), s[pos])){ //下面优先级高可以先运算
cmp(nums, op.top());
op.pop();
}
op.push(s[pos]);
continue;
}
int cur = pos; //检测数
while (s[cur] >= '0' && s[cur] <= '9') cur++;
nums.push( atoi( s.substr(pos, cur-pos).c_str() ) );
pos = cur - 1;
}
while (!op.empty()){
cmp(nums, op.top());
op.pop();
}
return nums.top();
}
bool prior_cmp(char op1, char op2){ //优先级的比较
if (op1 == '*' || op1 == '/') return true;
if ( (op1 == '-' || op1 == '+') && (op2 == '+' || op2 == '-') ) return true;
return false;
}
void cmp(stack<int>& nums, char op){ //计算
int num2 = nums.top(); nums.pop();
int num1 = nums.top(); nums.pop();
switch (op){
case '+' :
nums.push(num1 + num2);
break;
case '-' :
nums.push(num1 - num2);
break;
case '*' :
nums.push(num1 * num2);
break;
case '/' :
nums.push(num1 / num2);
break;
}
}
};