给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1]
的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 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]
内 - 题目数据保证答案是一个 32-bit 整数
因为在做这题的原因是我刚学完栈的相关之后想找一些和栈有关的题,所以这道题我是从如何用栈来解决问题作为出发点进行思考的,可能有其他更好的思路,请多多包涵.
做题思路:首先不知道写什么先创建一个栈,再思考我第一个先想到的是要对进来的数据先进行判断,
Character.isDigit(s.charAt(i))
是一个 Java 字符串处理的方法,它用于判断指定索引处的字符是否是一个十进制数字。(s.charAt(i)
是用于获取字符串 s
中索引为 i
处的字符。)
因为s是String(字符串)类型所以要转换为整数类型,字符 '0'
对应的整数值是 48,所以s.charAt(i) - '0'
这部分是将字符型数字转换为相应的整数值,接着,num * 10
将当前 num
变量的值乘以 10,相当于给 num
左移一位(乘以 10 相当于在末尾添加一位 0).这样就可以将连续的字符串转换为整数型,方便用来计算
class Solution {public int calculate(String s) {Deque<Integer> stack = new ArrayDeque<Integer>();int n = s.length();int num = 0;for (int i = 0; i < n; i++) {if (Character.isDigit(s.charAt(i))) {num = num * 10 + s.charAt(i) - '0';}}}
}
先提示下,
-
入栈(Push):将元素添加到栈的顶部。
-
出栈(Pop):从栈的顶部移除并返回元素。
Character.isSpaceChar(s.charAt(i))
是一个 Java 中用于判断指定字符是否属于"空格字符"的方法调用。
在对判断时的特殊情况进行处理
!Character.isDigit(s.charAt(i)) && !Character.isSpaceChar(s.charAt(i)) || i == n - 1
- 如果指定索引
i
处的字符不是一个数字字符且不是一个空格字符,或者i
等于指定字符串s
的长度减去 1(即最后一个字符的索引),则返回true
。 - 否则,返回
false
。
之后,我们该有的都有了,就开始对已经处理好的整数值进行处理,利用栈的特性和switch-case进行判断.
- 如果是
+
运算符,则将当前数字入栈. - 如果是
-
运算符,则将当前数字的负值入栈. - 如果是
*
运算符,则将栈顶数字弹出 (stack.pop()
),与当前数字相乘后再入栈. - 如果是
/
运算符,则将栈顶数字弹出,除以当前数字后再入栈. - 在遇到非数字字符或字符串末尾时,需要将当前数字清零 (
num = 0
),以便接下来的数字累加. -
class Solution {public int calculate(String s) {Deque<Integer> stack = new ArrayDeque<Integer>();int n = s.length();char preSign = '+';int num = 0;for (int i = 0; i < n; i++) {if (Character.isDigit(s.charAt(i))) {num = num * 10 + s.charAt(i) - '0';}if (!Character.isDigit(s.charAt(i)) && !Character.isSpaceChar(s.charAt(i)) || i == n - 1) {switch (preSign) {case '+':stack.push(num);break;case '-':stack.push(-num);break;case '*':stack.push(stack.pop() * num);break;case '/':stack.push(stack.pop() / num);break;}preSign = s.charAt(i);num = 0;}}} }
,最后在对栈中得到的元素进行累加,再将结果返回就得到题目的答案了
int ans = 0;while (!stack.isEmpty()) {ans += stack.pop();}return ans;
这是最终的代码,大家可以学习下.
class Solution {public int calculate(String s) {Deque<Integer> stack = new ArrayDeque<Integer>();int n = s.length();char preSign = '+';int num = 0;for (int i = 0; i < n; i++) {if (Character.isDigit(s.charAt(i))) {num = num * 10 + s.charAt(i) - '0';}if (!Character.isDigit(s.charAt(i)) && !Character.isSpaceChar(s.charAt(i)) || i == n - 1) {switch (preSign) {case '+':stack.push(num);break;case '-':stack.push(-num);break;case '*':stack.push(stack.pop() * num);break;case '/':stack.push(stack.pop() / num);break;}preSign = s.charAt(i);num = 0;}}int ans = 0;while (!stack.isEmpty()) {ans += stack.pop();}return ans;}
}
到这里就结束了感谢你的浏览.