实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
分析:
逐个字符分析,是数字就计算数字,然后入栈保存,是运算符号就优先计算乘法和除法后进栈,减法当做加法的负运算进栈,加法就直接把数字进栈,最后遍历栈元素执行加法。
class Solution {
private:
int is_sign(char ch){
if(ch=='+' || ch=='-' || ch=='*' || ch=='/') return 1;
return 0;
}
public:
int calculate(string s) {
// 保留数字
stack<int> st;
// 初始化上一次遇到的操作符
char op = '+';
int num = 0;
for(int i=0; i<s.size(); i++){
char ch = s[i];
if(ch>='0' && ch<='9'){
// 数字
num *= 10;
num += ch-'0';
}
if(is_sign(ch) || i==s.size()-1){
if(op == '+')st.push(num);
if(op == '-')st.push(-num);
if(op == '*'){
int tmp = st.top();
st.pop();
st.push(tmp*num);
}
if(op == '/'){
int tmp=st.top();
st.pop();
st.push(tmp/num);
}
op = ch;
num = 0;
}
}
// 出栈计算结果
int result = 0;
while(!st.empty()){
result += st.top();
st.pop();
}
return result;
}
};