Leetcode 227. 基本计算器 II
题目
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
测试样例
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数 eval。
题解
利用栈
如果符号栈顶的优先级大,则进行运算,否则压入符号栈。详细过程见代码
代码
int calculate(string s) {
stack<char> fuhao; //符号栈
stack<long> conclude; //数字栈
int i=0,len=s.length();
while(i < len){
if(s[i] == ' ') i++;
else if(s[i]>='0' && s[i]<='9'){ //获取数字
long x = s[i]-'0';
i++;
while(i<len && s[i]>='0' && s[i]<='9'){
x = x*10 + s[i]-'0';
i++;
}
conclude.push(x);
}else{
while(!fuhao.empty() && (fuhao.top()=='*' || fuhao.top()=='/' || s[i]=='+' || s[i]=='-')){ //栈顶优先级大,则完成栈中的运算
long x = conclude.top();
conclude.pop();
long y = conclude.top();
conclude.pop();
if(fuhao.top() == '+') conclude.push(y+x);
else if(fuhao.top() == '-') conclude.push(y-x);
else if(fuhao.top() == '*') conclude.push(y*x);
else conclude.push(y/x);
fuhao.pop();
}
fuhao.push(s[i]);
i++;
}
}
while(!fuhao.empty()){
long x = conclude.top();
conclude.pop();
long y = conclude.top();
conclude.pop();
if(fuhao.top() == '+') conclude.push(y+x);
else if(fuhao.top() == '-') conclude.push(y-x);
else if(fuhao.top() == '*') conclude.push(y*x);
else conclude.push(y/x);
fuhao.pop();
}
return conclude.top();
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。