Skip to content

Commit a37e51e

Browse files
committed
Merged config.json
2 parents fbf8970 + 6c18cc5 commit a37e51e

6 files changed

Lines changed: 176 additions & 0 deletions

File tree

‎config.json‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"minesweeper",
5151
"series",
5252
"robot-simulator",
53+
"bracket-push",
5354
"binary-search-tree"
5455
],
5556
"exercises": [
@@ -283,6 +284,11 @@
283284
"difficulty": 1,
284285
"topics": []
285286
},
287+
{
288+
"slug": "bracket-push",
289+
"difficulty": 1,
290+
"topics": []
291+
},
286292
{
287293
"slug": "binary-search-tree",
288294
"difficulty": 1,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apply plugin: "java"
2+
apply plugin: "eclipse"
3+
apply plugin: "idea"
4+
5+
repositories {
6+
mavenCentral()
7+
}
8+
9+
dependencies {
10+
testCompile "junit:junit:4.12"
11+
}
12+
test {
13+
testLogging {
14+
exceptionFormat = 'full'
15+
events = ["passed", "failed", "skipped"]
16+
}
17+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import java.util.*;
2+
3+
final class BracketChecker {
4+
5+
private static final Map<Character, Character> BRACKET_PAIR_MAP = new HashMap<Character, Character>() {{
6+
put('[', ']');
7+
put('{', '}');
8+
put('(', ')');
9+
}};
10+
11+
private static boolean isOpeningBracket(final char character) {
12+
return BRACKET_PAIR_MAP.keySet().contains(character);
13+
}
14+
15+
private static boolean isClosingBracket(final char character) {
16+
return BRACKET_PAIR_MAP.values().contains(character);
17+
}
18+
19+
private final String expression;
20+
21+
BracketChecker(final String expression) {
22+
this.expression = expression;
23+
}
24+
25+
boolean areBracketsMatchedAndNestedCorrectly() {
26+
final Stack<Character> bracketsStack = new Stack<>();
27+
28+
for (final char character : expression.toCharArray()) {
29+
if (isOpeningBracket(character)) {
30+
bracketsStack.push(character);
31+
} else if (isClosingBracket(character)) {
32+
if (bracketsStack.isEmpty()) {
33+
return false;
34+
}
35+
36+
if (!BRACKET_PAIR_MAP.get(bracketsStack.pop()).equals(character)) {
37+
return false;
38+
}
39+
}
40+
}
41+
42+
return bracketsStack.isEmpty();
43+
}
44+
45+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
final class BracketChecker {
2+
3+
4+
5+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import org.junit.Ignore;
2+
import org.junit.Test;
3+
4+
import static org.junit.Assert.assertEquals;
5+
import static org.junit.Assert.assertFalse;
6+
import static org.junit.Assert.assertTrue;
7+
8+
public final class BracketCheckerTest {
9+
10+
@Test
11+
public void testPairedSquareBrackets() {
12+
final BracketChecker bracketChecker = new BracketChecker("[]");
13+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
14+
}
15+
16+
@Ignore
17+
@Test
18+
public void testEmptyString() {
19+
final BracketChecker bracketChecker = new BracketChecker("");
20+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
21+
}
22+
23+
@Ignore
24+
@Test
25+
public void testUnpairedBrackets() {
26+
final BracketChecker bracketChecker = new BracketChecker("[[");
27+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
28+
}
29+
30+
@Ignore
31+
@Test
32+
public void testIncorrectlyOrderedBrackets() {
33+
final BracketChecker bracketChecker = new BracketChecker("}{");
34+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
35+
}
36+
37+
@Ignore
38+
@Test
39+
public void testPairedBracketsWithWhitespace() {
40+
final BracketChecker bracketChecker = new BracketChecker("{ }");
41+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
42+
}
43+
44+
@Ignore
45+
@Test
46+
public void testSimpleNestedBrackets() {
47+
final BracketChecker bracketChecker = new BracketChecker("{[]}");
48+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
49+
}
50+
51+
@Ignore
52+
@Test
53+
public void testSeveralPairedBrackets() {
54+
final BracketChecker bracketChecker = new BracketChecker("{}[]");
55+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
56+
}
57+
58+
@Ignore
59+
@Test
60+
public void testPairedAndNestedBrackets() {
61+
final BracketChecker bracketChecker = new BracketChecker("([{}({}[])])");
62+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
63+
}
64+
65+
@Ignore
66+
@Test
67+
public void testUnopenedClosingBracket() {
68+
final BracketChecker bracketChecker = new BracketChecker("{[)][]}");
69+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
70+
}
71+
72+
@Ignore
73+
@Test
74+
public void testUnpairedAndNestedBracket() {
75+
final BracketChecker bracketChecker = new BracketChecker("([{])");
76+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
77+
}
78+
79+
@Ignore
80+
@Test
81+
public void testPairedAndIncorrectlyNestedBrackets() {
82+
final BracketChecker bracketChecker = new BracketChecker("[({]})");
83+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
84+
}
85+
86+
@Ignore
87+
@Test
88+
public void testValidMathExpression() {
89+
final BracketChecker bracketChecker = new BracketChecker("(((185 + 223.85) * 15) - 543)/2");
90+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
91+
}
92+
93+
@Ignore
94+
@Test
95+
public void testValidComplexLaTeXExpression() {
96+
final BracketChecker bracketChecker = new BracketChecker(
97+
"\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)");
98+
99+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
100+
}
101+
102+
}

‎exercises/settings.gradle‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ include 'beer-song'
77
include 'binary'
88
include 'binary-search-tree'
99
include 'bob'
10+
include 'bracket-push'
1011
include 'crypto-square'
1112
include 'difference-of-squares'
1213
include 'etl'

0 commit comments

Comments
 (0)