Skip to content

Commit 7129eb8

Browse files
committed
feat: add solutions to lc problem: No.0224
No.0224.Basic Calculator
1 parent e912f7d commit 7129eb8

File tree

10 files changed

+623
-91
lines changed

10 files changed

+623
-91
lines changed

solution/0200-0299/0224.Basic Calculator/README.md

+229-1
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,250 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:栈**
55+
56+
我们用一个栈 $stk$ 来保存当前的计算结果和操作符,用一个变量 $sign$ 保存当前的符号,变量 $ans$ 保存最终的计算结果。
57+
58+
接下来,我们遍历字符串 $s$ 的每一个字符:
59+
60+
- 如果当前字符是数字,那么我们用一个循环将后面的连续数字都读进来,然后用当前的符号将其加或者减到 $ans$ 中。
61+
- 如果当前字符是 `'+'`,我们修改变量 $sign$ 为正号。
62+
- 如果当前字符是 `'-'`,我们修改变量 $sign$ 为负号。
63+
- 如果当前字符是 `'('`,我们把当前的 $ans$ 和 $sign$ 入栈,并分别置空置 1,重新开始计算新的 $ans$ 和 $sign$。
64+
- 如果当前字符是 `')'`,我们弹出栈顶的两个元素,一个是操作符,一个是括号前计算好的数字,我们将当前的数字乘上操作符,再加上之前的数字,作为新的 $ans$。
65+
66+
遍历完字符串 $s$ 之后,我们返回 $ans$。
67+
68+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是字符串 $s$ 的长度。
69+
5470
<!-- tabs:start -->
5571

5672
### **Python3**
5773

5874
<!-- 这里可写当前语言的特殊实现逻辑 -->
5975

6076
```python
61-
77+
class Solution:
78+
def calculate(self, s: str) -> int:
79+
stk = []
80+
ans, sign = 0, 1
81+
i, n = 0, len(s)
82+
while i < n:
83+
if s[i].isdigit():
84+
x = 0
85+
j = i
86+
while j < n and s[j].isdigit():
87+
x = x * 10 + int(s[j])
88+
j += 1
89+
ans += sign * x
90+
i = j - 1
91+
elif s[i] == "+":
92+
sign = 1
93+
elif s[i] == "-":
94+
sign = -1
95+
elif s[i] == "(":
96+
stk.append(ans)
97+
stk.append(sign)
98+
ans, sign = 0, 1
99+
elif s[i] == ")":
100+
ans = stk.pop() * ans + stk.pop()
101+
i += 1
102+
return ans
62103
```
63104

64105
### **Java**
65106

66107
<!-- 这里可写当前语言的特殊实现逻辑 -->
67108

68109
```java
110+
class Solution {
111+
public int calculate(String s) {
112+
Deque<Integer> stk = new ArrayDeque<>();
113+
int sign = 1;
114+
int ans = 0;
115+
int n = s.length();
116+
for (int i = 0; i < n; ++i) {
117+
char c = s.charAt(i);
118+
if (Character.isDigit(c)) {
119+
int j = i;
120+
int x = 0;
121+
while (j < n && Character.isDigit(s.charAt(j))) {
122+
x = x * 10 + s.charAt(j) - '0';
123+
j++;
124+
}
125+
ans += sign * x;
126+
i = j - 1;
127+
} else if (c == '+') {
128+
sign = 1;
129+
} else if (c == '-') {
130+
sign = -1;
131+
} else if (c == '(') {
132+
stk.push(ans);
133+
stk.push(sign);
134+
ans = 0;
135+
sign = 1;
136+
} else if (c == ')') {
137+
ans = stk.pop() * ans + stk.pop();
138+
}
139+
}
140+
return ans;
141+
}
142+
}
143+
```
144+
145+
### **C++**
146+
147+
```cpp
148+
class Solution {
149+
public:
150+
int calculate(string s) {
151+
stack<int> stk;
152+
int ans = 0, sign = 1;
153+
int n = s.size();
154+
for (int i = 0; i < n; ++i) {
155+
if (isdigit(s[i])) {
156+
int x = 0;
157+
int j = i;
158+
while (j < n && isdigit(s[j])) {
159+
x = x * 10 + (s[j] - '0');
160+
++j;
161+
}
162+
ans += sign * x;
163+
i = j - 1;
164+
} else if (s[i] == '+') {
165+
sign = 1;
166+
} else if (s[i] == '-') {
167+
sign = -1;
168+
} else if (s[i] == '(') {
169+
stk.push(ans);
170+
stk.push(sign);
171+
ans = 0;
172+
sign = 1;
173+
} else if (s[i] == ')') {
174+
ans *= stk.top();
175+
stk.pop();
176+
ans += stk.top();
177+
stk.pop();
178+
}
179+
}
180+
return ans;
181+
}
182+
};
183+
```
184+
185+
### **Go**
186+
187+
```go
188+
func calculate(s string) (ans int) {
189+
stk := []int{}
190+
sign := 1
191+
n := len(s)
192+
for i := 0; i < n; i++ {
193+
switch s[i] {
194+
case ' ':
195+
case '+':
196+
sign = 1
197+
case '-':
198+
sign = -1
199+
case '(':
200+
stk = append(stk, ans)
201+
stk = append(stk, sign)
202+
ans, sign = 0, 1
203+
case ')':
204+
ans *= stk[len(stk)-1]
205+
stk = stk[:len(stk)-1]
206+
ans += stk[len(stk)-1]
207+
stk = stk[:len(stk)-1]
208+
default:
209+
x := 0
210+
j := i
211+
for ; j < n && '0' <= s[j] && s[j] <= '9'; j++ {
212+
x = x*10 + int(s[j]-'0')
213+
}
214+
ans += sign * x
215+
i = j - 1
216+
}
217+
}
218+
return
219+
}
220+
```
221+
222+
### **TypeScript**
223+
224+
```ts
225+
function calculate(s: string): number {
226+
const stk: number[] = [];
227+
let sign = 1;
228+
let ans = 0;
229+
const n = s.length;
230+
for (let i = 0; i < n; ++i) {
231+
if (s[i] === ' ') {
232+
continue;
233+
}
234+
if (s[i] === '+') {
235+
sign = 1;
236+
} else if (s[i] === '-') {
237+
sign = -1;
238+
} else if (s[i] === '(') {
239+
stk.push(ans);
240+
stk.push(sign);
241+
ans = 0;
242+
sign = 1;
243+
} else if (s[i] === ')') {
244+
ans *= stk.pop() as number;
245+
ans += stk.pop() as number;
246+
} else {
247+
let x = 0;
248+
let j = i;
249+
for (; j < n && !isNaN(Number(s[j])) && s[j] !== ' '; ++j) {
250+
x = x * 10 + (s[j].charCodeAt(0) - '0'.charCodeAt(0));
251+
}
252+
ans += sign * x;
253+
i = j - 1;
254+
}
255+
}
256+
return ans;
257+
}
258+
```
259+
260+
### **C#**
69261

262+
```cs
263+
public class Solution {
264+
public int Calculate(string s) {
265+
var stk = new Stack<int>();
266+
int sign = 1;
267+
int n = s.Length;
268+
int ans = 0;
269+
for (int i = 0; i < n; ++i) {
270+
if (s[i] == ' ') {
271+
continue;
272+
}
273+
if (s[i] == '+') {
274+
sign = 1;
275+
} else if (s[i] == '-') {
276+
sign = -1;
277+
} else if (s[i] == '(') {
278+
stk.Push(ans);
279+
stk.Push(sign);
280+
ans = 0;
281+
sign = 1;
282+
} else if (s[i] == ')') {
283+
ans *= stk.Pop();
284+
ans += stk.Pop();
285+
} else {
286+
int num = 0;
287+
while (i < n && char.IsDigit(s[i])) {
288+
num = num * 10 + s[i] - '0';
289+
++i;
290+
}
291+
--i;
292+
ans += sign * num;
293+
}
294+
}
295+
return ans;
296+
}
297+
}
70298
```
71299

72300
### **...**

0 commit comments

Comments
 (0)