题目:
给你一个字符串表达式 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;}}}
