题目描述
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例:
输入: "3+2*2"
输出: 7
参考思路
推荐题解。
-
遇到数字入栈 s 1 s1 s1。
-
遇到运算符 o p op op时。
-
当 o p op op 比 栈顶的运算符优先级高时, o p op op入栈 s 2 s2 s2。
-
当 o p op op 比 栈顶的运算符优先级低或相等时。栈 s 2 s2 s2中运算符要先弹出来,计算值 v v v, v v v再入栈 s 1 s1 s1。
-
例如:
3
+
2
∗
2
−
1
3+2*2-1
3+2∗2−1

参考代码
class Solution {
public:
int calculate(string s) {
string t;
for(int i=0;i<s.size();++i) if(s[i] != ' ') t+=s[i];
vector<int> digits; // 这里其实应该用栈
vector<int> opors;
int i=0;
while(i < t.size()){
int k = 0;
while(i < t.size() && isdigit(t[i])) k=10*k+(t[i++]-'0');
digits.push_back(k);
if(i >= t.size()) break;
while(!opors.empty() && priorityOfOpors(t[i]) <= priorityOfOpors(opors.back())){
done(digits,opors);
}
opors.push_back(t[i++]); // 操作符入栈
}
// 后处理
while(opors.size()){
done(digits, opors);
}
return digits.back();
}
bool priorityOfOpors(char ch){
if(ch == '+' || ch == '-')
return 0;
else
return 1;
}
void done(vector<int>& digits,vector<int>& opors){
int r=digits.back(); digits.pop_back();
int l=digits.back(); digits.pop_back();
int op=opors.back(); opors.pop_back();
int c;
switch(op){
case '+':c=l+r;
break;
case '-':c=l-r;
break;
case '*':c=l*r;
break;
case '/':c=l/r;
break;
default:break;
}
digits.push_back(c);
}
};
本文介绍了一个基于栈的数据结构实现的基本计算器算法,用于计算包含非负整数和四则运算符的简单字符串表达式的值。文章提供了详细的算法思路和C++代码实现,包括如何处理运算符的优先级和整数除法的特殊情况。
843

被折叠的 条评论
为什么被折叠?



