Estoy tratando de escribir 2 métodos que pueden ordenar una cadena de corchetes usando solo 1 declaración de pila y 1 cambio. No puedo hacer que funcione, me pregunto si puede deberse a casos de '' en cadenas. ¿No debería el caso predeterminado recoger estos o he entendido mal las declaraciones de cambio? Aquí es donde estoy ahora.
out.println(checkParentheses("({} [()] ({}))")); // should print true out.println(!checkParentheses("({} [() ({)})")); // should print false Boolean checkParentheses(String brackets) { Deque<Character> stack = new ArrayDeque<>(); for( char ch : brackets.toCharArray()) { if (stack.peek() == matching(ch)) { stack.pop(); } else { stack.add(ch); } } return stack.isEmpty(); } char matching(char ch) { // char c = (' '); switch (ch) { case ')': return '('; // c = '(' case ']': return '['; case '}': return '{'; default: // return c; throw new IllegalArgumentException("No match found"); } } Básicamente, checkParentheses debería ser tan simple como sigue:
public static boolean checkParentheses(String str) { if (null == str || str.isEmpty()) { return true; } Deque<Character> stack = new ArrayDeque<>(); for (char c : str.toCharArray()) { if (openingBracket(c)) { stack.push(c); } else if (closingBracket(c)) { if (stack.isEmpty() || matchingBracket(c) != stack.pop()) { return false; } } // else ignore non-bracket char quietly } return stack.isEmpty(); } Luego, los métodos adicionales pueden verse de la siguiente manera usando la instrucción switch :
static boolean openingBracket(char c) { switch (c) { case '(': case '[': case '{': case '<': return true; default: return false; } } static boolean closingBracket(char c) { switch (c) { case ')': case ']': case '}': case '>': return true; default: return false; } } static char matchingBracket(char c) { switch (c) { case ')': return '('; case ']': return '['; case '}': return '{'; case '>': return '<'; default: throw new IllegalArgumentException("Bad character found instead of closing bracket: " + c); } }Entonces el resultado de las pruebas es el siguiente:
System.out.println(checkParentheses("({} [()] ({}))")); // true, balance ok System.out.println(!checkParentheses("({} [() ({)})")); // true, NOT balanced