227. 基本计算器 II
题目
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
解法
栈
利用栈将四则运算化简成加法运算
此算法的思路很简单,先把乘除法的值计算出来,最终将所有的运算简化成只有加法。
- 先跳过空格
- 出现了数字则记录整个数字是多少,然后根据之前的运算符决定下一步:
- 如果是加号’+’,说明前面的运算独立于以后的运算,可以将结果暂时放入栈;
- 如果是减号’-’,可以看成-1 * tempNum,然后将-tempNum入栈;
- 如果是乘号’*‘或者除号’/’,由于前面的运算独立于此,可以先计算lastNum和tempNum积,然后结果入栈。
- 最后将栈中的所有元素相加就是答案。
public int calculate(String s) {
Deque<Integer> stack = new LinkedList<>();
char[] arr = s.toCharArray();
char lastOps = '+';
for (int i = 0; i < s.length(); i++) {
// 跳过空格
if (arr[i] == ' ') {
continue;
}
if (Character.isDigit(arr[i])) {
int tempNum = arr[i] - '0';
// 如果是数字则继续向后遍历计算出数字
while (++i < s.length() && Character.isDigit(arr[i])) {
tempNum = tempNum * 10 + arr[i] - '0';
}
// 最后多了一个+1的操作,需要-1
i--;
// 判断运算符的类型:+则直接入栈、-将相反数入栈、*/则将栈顶元素出栈并运算
if (lastOps == '+') {
stack.push(tempNum);
} else if (lastOps == '-') {
stack.push(-tempNum);
} else if (lastOps == '*') {
stack.push(stack.pop() * tempNum);
} else {
stack.push(stack.pop() / tempNum);
}
// 如果是运算符则记录运算符
} else {
lastOps = arr[i];
}
}
// 计算其中每个运算的值
int num = 0;
for (int i : stack) {
num += i;
}
return num;