Я написал функцию, чтобы проверить, сбалансированы ли круглые скобки, то есть {([])} истина, {(}) ложь. Но сейчас я пытаюсь понять, как учесть дополнительный символ «&», соответствующий самому себе, то есть & {&&} & true, & {&} false. Я попытался просто посчитать количество '&', чтобы увидеть, четное ли оно, но, похоже, это не сработало. Любые идеи?

public static boolean isBalanced(String input) {
    if (input == null || input.length() == 1) return false;
    int size = input.length();
    if (size % 2 == 1) return false;

    Stack<Character> stack = new Stack<Character>();
    HashMap<Character, Character> map = new HashMap<Character, 
    Character>();
    map.put('(', ')');
    map.put('[', ']');
    map.put('{', '}');

    for (int i = 0; i < size; i++){
        char temp = input.charAt(i);
        if (map.containsKey(temp)) stack.push(temp);
        else if (stack.isEmpty() || map.get(stack.pop()) != temp) 
        return false;
    }

    return true;
}
0
Avi 11 Сен 2018 в 19:56

1 ответ

Лучший ответ

Когда вы видите &, а вершина стека - это &, вытолкните его, в противном случае нажмите &.

Чтобы ваш код справился с этим, без особой обработки &, просто замените код, чтобы проверить stack перед map.

Другие проблемы с вашим кодом:

  • Класс Stack - это устаревший класс, созданный поверх синхронизированного Vector класс. Как сказано в javadoc, вы должны использовать {{X2} } вместо этого.

  • Не сворачивайте слишком много своих заявлений. Поместите оператор, контролируемый if в отдельной строке, для удобства чтения человеком.

  • Не используйте == (или !=) для сравнения объектов, используйте equals().

  • Вы забыли проверить, пуст ли стек после цикла, чтобы убедиться, что нет болтающихся пар.

public static boolean isBalanced(String input) {
    if (input == null)
        return false;
    int size = input.length();
    if (size % 2 == 1)
        return false;

    HashMap<Character, Character> map = new HashMap<>();
    map.put('(', ')');
    map.put('[', ']');
    map.put('{', '}');
    map.put('&', '&');

    Deque<Character> stack = new ArrayDeque<>();
    for (int i = 0; i < size; i++) {
        Character temp = input.charAt(i); // autobox here so it only happens once
        if (temp.equals(stack.peek())) // equals is false if stack is empty, since peek returns null
            stack.pop();
        else if (map.containsKey(temp))
            stack.push(map.get(temp));
        else
            return false;
    }

    return stack.isEmpty();
}

Тест

System.out.println(isBalanced("{([])}"));
System.out.println(isBalanced("{(})"));
System.out.println(isBalanced("&{&&}&"));
System.out.println(isBalanced("&{&}"));
System.out.println(isBalanced("(("));

Вывод

true
false
true
false
false
2
Andreas 11 Сен 2018 в 20:48