文章目录
- 题目解析
- 解题
- 小结
题目解析
给你一个字符串表达式 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 整数
下面是题目的链接:
基本计算器||
- 解析:
因为给定的是一个字符串s ,所以要想遍历字符串,先要将它转化成一个字符数组。我们要利用栈的性质来进行模拟算术运算,因为只有加减乘除,所以乘除的优先级是高的。先定义一个变量 op 表示运算符,当我们遇到加号和减号时,直接将加号或减号前的数字压入栈中。为了方便最后的计算,当遇到是减号时,压入栈中的数字是负的即可,这样,最后计算时,全部相加在一起就可以了。当我们遇到乘除时,将栈顶元素弹出和下一个数运算即可。还有一点,当遇到不是个位数时,我们需要继续往后遍历,tmp * 10+ss[ i ] 就可以解决这个问题。
值得注意的是,当遇到空格时,直接 i++ 就可以跳过了。
解题
class Solution {
public int calculate(String s) {
char op = '+';
Stack<Integer> ret = new Stack<>();
int n = s.length();
char[] ss = s.toCharArray();
int i = 0;
while (i < n){
if (ss[i] == ' '){
i++;
} else if (ss[i] >= '0' && ss[i] <= '9') {
int tmp = 0;
while (i < n && ss[i] >= '0' && ss[i] <= '9'){
tmp = tmp * 10 + (ss[i] - '0');
i++;
}
if (op == '+'){
ret.push(tmp);
} else if (op == '-') {
ret.push(-tmp);
}else if (op == '*'){
ret.push(ret.pop()*tmp);
}else {
ret.push(ret.pop()/tmp);
}
}else {
op = ss[i];
i++;
}
}
int sum = 0;
while (!ret.isEmpty()){
sum += ret.pop();
}
return sum;
}
}
小结
对于这种模拟运算的题,都可以使用栈的优先级特性来进行解决。