Правильная расстановка скобок с помощью Stack в Java
Программа проверяет правильность расстановки скобок в заданной пользователем строке с помощью стека.
Код правильно отрабатывает до момента, когда нужно вывести индекс первой открывающейся скобки, для которой не найдена закрывающаяся. Не могу понять, как вывести этот индекс, к примеру,
((({[]}) -> 2
()[() -> 3.
Сам код выглядит так:
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.nextLine();
System.out.println(isBalanced(s));
}
}
public static String isBalanced(String str) {
Stack<Character> stack = new Stack<>();
char c;
int count = 0;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
count++;
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
}
if (c == ')' || c == '}' || c == ']') {
if (stack.isEmpty()) {
return String.valueOf(count);
}
char top = stack.peek();
if ((c == ')' && top == '(') || (c == '}' && top == '{') || (c == ']' && top == '[')) {
stack.pop();
} else {
return String.valueOf(count);
}
}
}
if (!stack.isEmpty()) {
return String.valueOf(str.lastIndexOf(stack.peek()));
}
return "Success";
}
}
Вот эта проверка неправильная и не знаю как сделать ее верной:
if (!stack.isEmpty()) {
return String.valueOf(str.lastIndexOf(stack.peek()));
}
Ответы (2 шт):
Автор решения: Aziz Umarov
→ Ссылка
Создайте объект подобие CharIndex{index:..., char:...}, и храните его в стеке либо второй стек индексов.
Автор решения: skyho
→ Ссылка
вот такой пример
public class MainRun {
public static void main(String[] args) {
HashMap<String, Integer> openBrackets = new HashMap<String, Integer>() {{
put("{", 0);
put("[", 1);
put("(", 2);
}};
HashMap<String, Integer> closeBrackets = new HashMap<String, Integer>() {{
put("}", 0);
put("]", 1);
put(")", 2);
}};
// String brackets = "{a,},(b,),[c,], {";
// String brackets = "{";
String brackets = "[,]},{";
boolean validate = validate(openBrackets, closeBrackets, brackets);
if(validate) {
System.out.println("Скобки расставлены правильно.");
} else {
System.out.println("Скобки расставлены не правильно.");
}
}
сама реализация
public class ValidationBrackets {
public static boolean validate( HashMap<String, Integer> openBrackets,
HashMap<String, Integer> closeBrackets,
String brackets){
String[] strings = brackets.split(",");
Deque<String> stack = new ArrayDeque<>();
for (String inLine: strings) {
for (int i = 0; i < inLine.length(); i++) {
char character = inLine.charAt(i);
String symbol = Character.toString(character);
if (openBrackets.containsKey(symbol)) {
stack.push(symbol);
} else if (closeBrackets.containsKey(symbol)) {
if(!stack.isEmpty()) {
Integer ordinalNumberForCheckedSymbol = closeBrackets.get(symbol);
String firstElemFromStack = stack.pop();
Integer ordinalLastAddedNumberElemFromStack = openBrackets.get(firstElemFromStack);
boolean isPairTheBrackets =
ordinalLastAddedNumberElemFromStack.equals(ordinalNumberForCheckedSymbol);
if(isPairTheBrackets) break;
}
return false;
}
}
}
return stack.isEmpty();
}
}
Само решение (его идею) нашел на просторах сети и немного переделал. Но его еще можно сделать меньше и понятнее...