力扣题目
解题思路
java代码
力扣题目:
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 1:
输入:s = "1 + 1" 输出:2
示例 2:
输入:s = " 2-1 + 2 " 输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)" 输出:23
解题思路:
算法原理:
这道题使用两个栈,一个数字栈 numStack
存储数字,一个操作符栈 opStack
存储操作符,通过遍历输入的字符串,按照运算规则进行计算。
思路:
- 遍历字符串中的每个字符。
- 如果是数字,通过一个循环将连续的数字提取出来并转换为整数,然后压入数字栈。
- 如果是
(
,直接压入操作符栈。 - 如果是
+
或-
,先计算操作符栈中优先级高于或等于当前操作符的表达式,然后将当前操作符压入操作符栈。 - 如果是
)
,计算操作符栈中直到遇到(
的表达式。 - 遍历结束后,处理操作符栈中剩余的操作符。
代码分析:
- 在
calculate
方法中,使用两个嵌套的循环来处理数字和操作符。- 外层循环遍历字符串。
- 内层循环处理连续的数字。
- 对于不同类型的字符,分别进行相应的处理:数字入数字栈,特定操作符进行计算或入操作符栈。
- 最后通过处理操作符栈中剩余的操作符得到最终结果。
时间复杂度:O(n),其中 n
是输入字符串的长度,需要遍历字符串一次。
空间复杂度:O(n),主要用于存储数字栈和操作符栈,它们的大小最大可能为输入字符串的长度。
java代码:
package org.example;
import java.util.Stack;
public class Leetcode224 {
public static void main(String[] args) {
Leetcode224 leetcode224 = new Leetcode224();
System.out.println(leetcode224.calculate("(1+(4+5+2)-3)+(6+8)"));
}
public int calculate(String s) {
Stack<Integer> numStack = new Stack<>();
Stack<Character> opStack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
int num = 0;
while (i < s.length() && Character.isDigit(s.charAt(i))) {
num = num * 10 + (s.charAt(i) - '0');
i++;
}
i--;
numStack.push(num);
} else if (c == '(') {
opStack.push(c);
} else if (c == '+' || c == '-') {
while (!opStack.isEmpty() && opStack.peek()!= '(') {
int num2 = numStack.pop();
int num1 = numStack.pop();
char op = opStack.pop();
if (op == '+') {
numStack.push(num1 + num2);
} else {
numStack.push(num1 - num2);
}
}
opStack.push(c);
} else if (c == ')') {
while (opStack.peek()!= '(') {
int num2 = numStack.pop();
int num1 = numStack.pop();
char op = opStack.pop();
if (op == '+') {
numStack.push(num1 + num2);
} else {
numStack.push(num1 - num2);
}
}
opStack.pop();
}
}
while (!opStack.isEmpty()) {
int num2 = numStack.pop();
int num1 = numStack.pop();
char op = opStack.pop();
if (op == '+') {
numStack.push(num1 + num2);
} else {
numStack.push(num1 - num2);
}
}
return numStack.peek();
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项