题目地址
题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
题解
由于只有加减和括号,遇到括号直接展开就行了, 需要用栈记录括号前的是加还是减
class Solution {
public int calculate(String s) {
Deque<Integer> signStack = new LinkedList<>();
signStack.offerLast(1);
int result = 0;
int sign = 1;
char[] array = s.toCharArray();
int i = 0;
while (i < array.length) {
if (array[i] == ' ') {
i++;
} else if (array[i] == '+') {
sign = signStack.peekLast();
i++;
} else if (array[i] == '-') {
sign = -signStack.peekLast();
i++;
} else if (array[i] == '(') {
signStack.offerLast(sign);
i++;
} else if (array[i] == ')') {
sign = signStack.pollLast();
i++;
} else {
int number = 0;
while (i < array.length && array[i] >= '0' && array[i] <= '9') {
number = number * 10 + (array[i] - '0');
i++;
}
result = result + sign * number;
}
}
return result;
}
}
复杂度分析
-
时间复杂度:,其中 为字符串 的长度。需要遍历字符串 一次,计算表达式的值。
-
空间复杂度:,其中 为字符串 的长度。空间复杂度主要取决于栈的空间,栈中的元素数量不超过 。