链接:
https://leetcode.com/problems/basic-calculator-ii/
大意:
实现一个计算器。给定一个字符串s,字符串s中的字符由'0'-'9'的数字以及'+'、'-'、'*'、'/'以及空格组成。要求求出字符串s所代表表达式的结果。例子:

思路:
构造两个栈,一个为操作数栈,里面存放操作数(整数);一个为操作符栈,里面存放四种运算符(字符)。
- 将字符串中的所有操作数放入放入操作数栈,所有操作符放入操作符栈
- 根据操作数栈和操作符栈进行乘除法运算
- 最后进行加减法运算
代码:
// 两个相邻数字之间没有空格
class Solution {
public int calculate(String s) {
ArrayList<Integer> nums = new ArrayList<>(); // 构造操作数栈
ArrayList<Character> op = new ArrayList<>(); // 构造操作符栈
char pre = ' ';
for (char c : s.toCharArray()) {
if (c != ' ') {
// 当前字符是数字
if (c >= '0' && c <= '9') {
// 如果前一个字符也是数字
if (pre >= '0' && pre <= '9') {
if (nums.size() > 0)
nums.add(nums.remove(nums.size() - 1) * 10 + (c - '0'));
else
nums.add(c - '0');
} else {
nums.add(c - '0');
}
} else { // 当前数字是操作符
op.add(c);
}
}
pre = c;
}
int idx = 0;
// 先处理乘除法
while (idx < op.size()) {
char c = op.get(idx);
if (c == '*' || c == '/') {
op.remove(idx);
int num1 = nums.get(idx), num2 = nums.get(idx + 1);
if (c == '*')
nums.set(idx, num1 * num2);
else
nums.set(idx, num1 / num2);
nums.remove(idx + 1);
continue;
}
idx++;
}
// 再处理加减法
int res = nums.get(0);
idx = 0;
while (idx < op.size()) {
char c = op.get(idx);
if (c == '+')
res += nums.get(idx + 1);
if (c == '-')
res -= nums.get(idx + 1);
idx++;
}
return res;
}
}
结果:

结论:
使用栈思想解决的一个经典问题,但是感觉代码有点冗长。。。
本文详细解析了如何使用两个栈(操作数栈和操作符栈)来实现一个基本的计算器功能,能够处理包含加、减、乘、除的数学表达式。通过先处理乘除法再处理加减法的策略,有效地解决了表达式的计算问题。
1418

被折叠的 条评论
为什么被折叠?



