import java.util.*;
final class BracketChecker {
private static final Map<Character, Character> BRACKET_PAIR_MAP = new HashMap<Character, Character>() {{
put('[', ']');
put('{', '}');
put('(', ')');
}};
private static boolean isOpeningBracket(final char character) {
return BRACKET_PAIR_MAP.keySet().contains(character);
}
private static boolean isClosingBracket(final char character) {
return BRACKET_PAIR_MAP.values().contains(character);
}
private final String expression;
BracketChecker(final String expression) {
this.expression = expression;
}
boolean areBracketsMatchedAndNestedCorrectly() {
final Stack<Character> bracketsStack = new Stack<>();
for (final char character : expression.toCharArray()) {
if (isOpeningBracket(character)) {
bracketsStack.push(character);
} else if (isClosingBracket(character)) {
if (bracketsStack.isEmpty()) {
return false;
}
if (!BRACKET_PAIR_MAP.get(bracketsStack.pop()).equals(character)) {
return false;
}
}
}
return bracketsStack.isEmpty();
}
}