1. 题目
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 栈解题
- 先初始化操作符为+
- 遇见操作数,把操作数入栈(+n, -n)(+或者-)
- 如果操作符为*或者/,则与栈顶操作,替换栈顶
class Solution {
public:
int calculate(string s) {
stack<int> stk;
char op = '+';
int prev = 0, num = 0, ans = 0;
for(int i = 0; i < s.size(); i++)
{
//if(s[i] == ' ')不能写在这里,如果最后是空格,程序不能处理最后一个数
// continue;
if(isdigit(s[i]))
num = num * 10 + (s[i] - '0');
if(s[i] < '0' && s[i] != ' ' || i == s.size()-1)
{
if(op == '+')
stk.push(num);
else if(op == '-')
stk.push(-num);
else if(op == '*')
{
prev = stk.top();
stk.pop();
stk.push(prev*num);
}
else
{
prev = stk.top();
stk.pop();
stk.push(prev/num);
}
op = s[i];
num = 0;
}
}
while(!stk.empty())
{
ans += stk.top();
stk.pop();
}
return ans;
}
};
- 下一个操作符为
+,-
时将结果加到ans - 否则与后面的数继续当前操作
class Solution {
public:
int calculate(string s) {
char op = '+';
int curans = 0, num = 0, ans = 0;
for(int i = 0; i < s.size(); i++)
{
if(isdigit(s[i]))
num = num * 10 + (s[i] - '0');
if(s[i] < '0' && s[i] != ' ' || i == s.size()-1)
{
if(op == '+')
curans += num;
else if(op == '-')
curans -= num;
else if(op == '*')
curans *= num;
else
curans /= num;
if(s[i] == '+' || s[i] == '-' || i == s.size()-1)
{
ans += curans;
curans = 0;
}
op = s[i];
num = 0;
}
}
return ans;
}
};