Java — проверка, имеет ли данный символ [] соответствующие круглые скобки

#java

#java

Вопрос:

 //Given an array of Character consisting of "{[()]}" 
//return true if all parentheses match like above
//return false if all pairs of parentheses expression is say "([{])}" 

public boolean parenthesesMatch(Character [] input) {
    char c1 = '';
    char c2 = '';
    
    for(int i = 0; i < input.length/2; i   ) {
        c1 = input[i];
        c2 = input[input.length-1-i];
        if(c1 == '(') {
           if(c1   1 != c2) {
             return false;
           }
        }
        else {
            if(c1 2 != c2) {
               return false;
            }
        }
    }
 return true;
}
  

Я понял, что ввод символа [] не является вводом символа [], поэтому использование значений ascii не будет работать. Есть идеи, что будет работать? Должен ли я использовать стек?

Комментарии:

1. При автоматической упаковке и распаковке Java преобразуется Character в char и наоборот.

2. Используйте stack и помещайте в него символы, проходя по массиву и извлекая символ, если последующий элемент массива является его «закрывающим» совпадением. Пустой стек к концу итерации укажет, что все круглые скобки массива совпадают. Будет охватывать такие случаи, как "[{()()}[(){}]]" .

Ответ №1:

Используйте стек, который является LIFO.

Проверьте, открывается или закрывается символ, если он открывается, поместите его в стек, если он закрывается, извлеките его из стека и проверьте, соответствует ли закрывающий символ закрывающей фигурной скобке для открывающей фигурной скобки, которую вы выдвинули.

В конце концов, стек должен быть пустым, если все символы имеют соответствующий закрывающий символ.

 import java.util.Map;
import java.util.Stack;

public class Linter {

    public static boolean lint(char[] input){
        Stack<Character> stack = new Stack<>();
        for (char c: input) {
            if (isOpeningBrace(c)) {
                stack.push(c);
            } else if (isClosingBrace(c)){
                Character poppedChar = stack.pop();

                if (poppedChar == null){
                    return false; // stack is empty, no matching closing character
                }

                if (isNotMatching(poppedChar, c)){
                    return false; // the popped brace is not matching the closing char
                }
            }
        }

        return stack.isEmpty();
    }

    private static boolean isNotMatching(char openingBrace, char closingBrace){
        Map<Character, Character> matching = Map.of(
            '(',')','[',']','{','}'
        );
        return closingBrace != matching.get(openingBrace);
    }

    private static boolean isOpeningBrace(char c){
        Map<Character, Boolean> openingBraces = Map.of(
            '(', true, '[', true, '{', true
        );
        return openingBraces.get(c) != null;
    }

    private static boolean isClosingBrace(char c){
        Map<Character, Boolean> closingBraces = Map.of(
            ')', true, ']', true, '}', true
        );
        return closingBraces.get(c) != null;
    }

}