Правильная расстановка скобок с помощью 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();
    }
}

Само решение (его идею) нашел на просторах сети и немного переделал. Но его еще можно сделать меньше и понятнее...

→ Ссылка