原理:
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
来源:
力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
实现:
// 简单计算题2
class Solution {
public:
int mulDiv(vector<int>& nums, vector<char>& signs, string& s, int i){
int num = nums.back(); //第一个数
char sign = signs.back(); // 中间的符号
nums.pop_back();
signs.pop_back();
int ret = 0;
string temp;// 下一个数
int j = i;
for(; j<s.size(); ++j){
if(s[j] == ' ') continue;
if(!isdigit(s[j])) break;
temp += s[j];
}
ret = j;
int num2 = stoi(temp);
if(sign == '*')
num = num * num2;
else if(sign == '/')
num = num / num2;
nums.push_back(num);
return ret;
}
int calculate(string s) {
vector<int> nums;
vector<char> sign;
string t;
for(int i=0; i<s.size(); ++i){
if(isdigit(s[i])) {
t += s[i];
}else if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/'){
if(!t.empty()){
nums.push_back(stoi(t));
t.clear();
}
sign.push_back(s[i]);
if(s[i] == '*' || s[i] == '/')
i = mulDiv(nums, sign, s, i+1) - 1; // 将索引移动到乘除号后面的后面的位置
}
}
int ret = 0;
if(!t.empty()) nums.push_back(stoi(t));
ret += nums[0];
for(int i=0; i<sign.size(); ++i){ //最后的加和部分
if(sign.empty()) break;
if(sign[i] == '+'){
ret += nums[i+1];
}else if(sign[i] == '-'){
ret -= nums[i+1];
}
}
return ret;
}
};