import java.util.ArrayDeque;
import java.util.Deque;

public class PencocokKurung {

    public static void main(String[] args) {
        String[] uji = {
            "int x = (a + b) * c[indeks];",
            "if (data[i] < maks) { total += data[i]; }",
            "{[(])}",       // pasangan bersilang
            "((()))(",      // kurung buka tanpa pasangan
            "())"           // kurung tutup tanpa pembuka
        };

        for (String teks : uji) {
            System.out.printf("%-42s -> %s%n", teks, cocok(teks));
        }
    }

    static String cocok(String teks) {
        Deque<Character> tumpukan = new ArrayDeque<>();
        for (char huruf : teks.toCharArray()) {
            if (huruf == '(' || huruf == '[' || huruf == '{') {
                tumpukan.push(huruf);      // pembuka ditumpuk
            } else if (huruf == ')' || huruf == ']' || huruf == '}') {
                if (tumpukan.isEmpty()) {
                    return "tidak cocok: '" + huruf + "' tanpa pembuka";
                }
                char pembuka = tumpukan.pop();
                if (!pasangan(pembuka, huruf)) {
                    return "tidak cocok: '" + pembuka + "' lawan '" + huruf + "'";
                }
            }
        }
        if (!tumpukan.isEmpty()) {
            return "tidak cocok: " + tumpukan.size()
                    + " pembuka tanpa penutup";
        }
        return "cocok";
    }

    static boolean pasangan(char pembuka, char penutup) {
        return (pembuka == '(' && penutup == ')')
                || (pembuka == '[' && penutup == ']')
                || (pembuka == '{' && penutup == '}');
    }
}
