题目地址
题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 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 整数
题解
利用栈,存储 + 或者 - 后面的值,然后求和就行了
class Solution {
public int calculate(String s) {
char[] array = s.toCharArray();
Deque<Integer> stack = new LinkedList<>();
int i = 0;
while (i < array.length) {
if (array[i] == ' ') {
i++;
continue;
}
int j = i;
if (array[j] == '+' || array[j] == '-' || array[j] == '*' || array[j] == '/') {
j++;
while (j < array.length) {
if (array[j] == ' ') {
j++;
continue;
} else {
break;
}
}
}
int number = 0;
while (j < array.length) {
if (array[j] >= '0' && array[j] <= '9') {
number = number * 10 + (array[j] - '0');
j++;
} else {
break;
}
}
if (array[i] == '+') {
stack.offerLast(number);
} else if (array[i] == '-') {
stack.offerLast(-number);
} else if (array[i] == '*') {
stack.offerLast(stack.pollLast() * number);
} else if (array[i] == '/') {
stack.offerLast(stack.pollLast() / number);
} else {
stack.offerLast(number);
}
i = j;
}
int result = 0;
while (!stack.isEmpty()) {
result += stack.pollLast();
}
return result;
}
}
复杂度分析
-
时间复杂度:,其中 为字符串 的长度。需要遍历字符串 一次,计算表达式的值。
-
空间复杂度:,其中 为字符串 的长度。空间复杂度主要取决于栈的空间,栈的元素个数不超过 。