#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;
}
}