224. 基本计算器(困难)twice

1,问题描述

224. 基本计算器

难度:困难

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()

示例 1:

1
2
输入:s = "1 + 1"
输出:2

示例 2:

1
2
输入:s = " 2-1 + 2 "
输出:3

示例 3:

1
2
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:

  • 1 <= s.length <= 3 * 105
  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式
  • ‘+’ 不能用作一元运算(例如, “+1” 和 "+(2 + 3)" 无效)
  • ‘-‘ 可以用作一元运算(即 “-1” 和 "-(2 + 3)" 是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位 整数

2,初步思考

​ 确实很难,需要使用到

3,代码处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.util.*;

public class _224基本计算器 {

public int calculate_gov(String s) {
Deque<Integer> ops = new LinkedList<Integer>();
ops.push(1);
int sign = 1;

int ret = 0;
int n = s.length();
int i = 0;
while (i < n) {
if (s.charAt(i) == ' ') {
i++;
} else if (s.charAt(i) == '+') {
sign = ops.peek();
i++;
} else if (s.charAt(i) == '-') {
sign = -ops.peek();
i++;
} else if (s.charAt(i) == '(') {
ops.push(sign);
i++;
} else if (s.charAt(i) == ')') {
ops.pop();
i++;
} else {
long num = 0;
while (i < n && Character.isDigit(s.charAt(i))) {
num = num * 10 + s.charAt(i) - '0';
i++;
}
ret += sign * num;
}
}
return ret;
}

static Set<String> sign_set = new HashSet<>();

static {
sign_set.add("+(");
sign_set.add("-(");
}

// 计算器
public int calculate_fail(String s) {
char[] charArray = s.toCharArray();
Deque<String> stack = new ArrayDeque<>();
int sum = 0;
String sign = "+";// 初始化符号
Integer num = 0;
StringBuilder sbTemp = new StringBuilder();
for (char c : charArray) {
if (c == ' ') {// 直接跳过无效数据
continue;
} else if (c != ')') {// 左括号或者数字
if (c >= '0' && c <= '9') {
sbTemp.append(c);
} else {
if (!sbTemp.isEmpty()) {
sbTemp.insert(0, sign);
stack.add(sbTemp.toString());
sbTemp = new StringBuilder();
sign = "+";
}

if (c == '+' || c == '-') {// 是+-符号
sign = c + "";
} else {// 是(
stack.add(sign + "(");
}
}
} else {// 右括号
if (!sbTemp.isEmpty()) {
sbTemp.insert(0, sign);
stack.add(sbTemp.toString());
sbTemp = new StringBuilder();
sign = "+";
}
int sumCur = 0;
while (!stack.isEmpty() && !sign_set.contains(stack.peekLast())) {
num = Integer.parseInt(Objects.requireNonNull(stack.pollLast()));
sumCur += num;
}
sign = stack.pollLast();
if (sign_set.contains(("+("))) {
stack.add(String.valueOf(sign_cover(sign.substring(0, 1)) * sumCur));
}
}
}
if (!sbTemp.isEmpty()) stack.add(sbTemp.toString());

while (!stack.isEmpty()) {
num = Integer.parseInt(Objects.requireNonNull(stack.pollLast()));
sum += num;
}
return sum;
}

private int sign_cover(String sign) {
if (Objects.equals(sign, "+") || Objects.equals(sign, "+(")) return 1;
if (Objects.equals(sign, "-") || Objects.equals(sign, "-(")) return -1;
return 1;
}

public static void main(String[] args) {
_224基本计算器 basicCalculator = new _224基本计算器();
// System.out.println(basicCalculator.calculate_fail("(1+(4+5+2)-3)+(6+8)"));// 23
// System.out.println(basicCalculator.calculate_fail("2147483647"));
// System.out.println(basicCalculator.calculate_fail("1 + ((1 + 1) + 1)"));
System.out.println(basicCalculator.calculate_fail("1-( -2)"));
}
}