题目:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = “3+2*2”
输出:7
示例 2:
输入:s = “ 3/2 “
输出:1
示例 3:
输入:s = “ 3+5 / 2 “
输出:5
提示:
- 1 <= s.length <= 3 * 105
- s 由整数和算符 (‘+’, ‘-‘, ‘*’, ‘/‘) 组成,中间由一些空格隔开
- s 表示一个 有效表达式
- 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
-
解答:
重点:
有 +, - ,*,/ 四种运算符;
- 没有括号。
既然包含 4 种运算符,那么就有运算符优先级的问题:先 ,/ ,再 +, - 。本题解的思路就是把所有的 ,/ 先计算出来,最后计算只有 +, - 运算符的表达式。
- 使用一个「栈」只保存需要进行 +, - 运算符的所有数字(把- 运算符改成负数放到栈中)。
- 如果遇到 *,/ 运算,则需要把结果先计算出来,也放到栈里;
- 在把所有乘除法计算完成之后,最后对栈内数字求和。
但是注意栈顶元素由于后面可能遇到 *,/ 运算符,所以栈顶元素有可能还会被弹出来,跟后面的运算符做计算。
class Solution {
public int calculate(String s) {
Stack<Integer> numStack = new Stack<>();
char lastOp = '+';
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (arr[i]==' ') {
continue;
}
if (Character.isDigit(arr[i])) {
int tempNum = arr[i] - '0';
i++;
while (i< arr.length && Character.isDigit(arr[i])) {
tempNum = tempNum * 10 + (arr[i] - '0');
i++;
}
i--;
if (lastOp == '+'){
numStack.push(tempNum);
}else if (lastOp == '-'){
numStack.push(-tempNum);
}else{
numStack.push(res(lastOp, numStack.pop(), tempNum));
}
} else {
lastOp = arr[i];
}
}
int ans = 0;
for (int num : numStack){
ans += num;
}
return ans;
}
private int res(char op, int a, int b) {
if (op == '*') {
return a * b;
}else{
return a / b;
}
}
}