Java - Проверка соответствия круглых скобок с дополнительным символом & - PullRequest
0 голосов
/ 11 сентября 2018

Я написал функцию для проверки сбалансированности круглых скобок, т.е. {([])} true, {(}) false.Но сейчас я пытаюсь выяснить, как учесть дополнительный символ '&', который соответствует самому себе, то есть & {&&} & 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;
}

1 Ответ

0 голосов
/ 11 сентября 2018

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

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

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

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

  • Не сверните слишком много своих утверждений.Поместите оператор, контролируемый 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
...