Skip to content

Commit 93a04e1

Browse files
committed
Implement Calculator with Brackets
1 parent 2d0993f commit 93a04e1

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/main/kotlin/ru/romanow/hard/BasicCalculatorWithBrackets.kt

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ru.romanow.hard
22

3+
import java.util.Stack
4+
35
/**
46
* Дана строка `s`, представляющая собой выражение, требуется вычислить это выражение и вернуть результат.
57
* Строка `s` валидная и состоит из целых чисел и операций (`+`, `-`, `(`, `)`), разделенных пробельными символами.
@@ -14,6 +16,42 @@ package ru.romanow.hard
1416
*/
1517
class BasicCalculatorWithBrackets {
1618
fun calculate(s: String): Int {
17-
return 0
19+
if (s.isBlank()) {
20+
return 0
21+
}
22+
23+
var number = 0
24+
val stack = Stack<Int>()
25+
var sign = 1
26+
var result = 0
27+
28+
for (chr in s) {
29+
when {
30+
chr.isDigit() -> {
31+
number = 10 * number + chr.digitToInt()
32+
}
33+
34+
chr == '(' -> {
35+
stack.push(result)
36+
stack.push(sign)
37+
result = 0
38+
sign = 1
39+
}
40+
41+
chr == ')' -> {
42+
result += sign * number
43+
number = 0
44+
result *= stack.pop()
45+
result += stack.pop()
46+
}
47+
48+
chr == '+' || chr == '-' -> {
49+
result += sign * number
50+
number = 0
51+
sign = if (chr == '+') 1 else -1
52+
}
53+
}
54+
}
55+
return result + sign * number
1856
}
1957
}

src/test/kotlin/ru/romanow/hard/BasicCalculatorWithBracketsTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class BasicCalculatorWithBracketsTest {
2020
internal class ValueProvider : ArgumentsProvider {
2121
override fun provideArguments(context: ExtensionContext): Stream<Arguments> =
2222
Stream.of(
23+
Arguments.of("1-(1+2)", -2),
2324
Arguments.of("1 + 1", 2),
2425
Arguments.of(" 2-1 + 2 ", 3),
2526
Arguments.of("(1+(4+5+2)-3)+(6+8)", 23)

0 commit comments

Comments
 (0)