package stack;

import java.util.Stack;
import java.util.*;

class Balanced {

    static boolean isOpen(char c) {
        return c == '(' || c == '{';
    }

    static boolean isClose(char c) {
        return c == ')' || c == '}';
    }

    static boolean matchingBracket(char open, char close) {
        return open == '(' && close == ')' || open == '{' && close == '}';
    }

    static boolean isBalanced(String s) {
        Stack<Character> stk = new Stack<Character>();
        for (int i = 0; i < s.length(); i++) {
            char sym = s.charAt(i);
            if (isOpen(sym))
                stk.push(new Character(sym));
            else if (isClose(sym)) {
                if (stk.empty())
                    return false;
                char open = ((Character) (stk.pop())).charValue();
                if (!matchingBracket(open, sym))
                    return false;
            }
        }
        return stk.empty();
    }

    public static void main(String[] args) {
        try{
            System.out.print("The string " + args[0]);
            if (isBalanced(args[0]))
                System.out.println(" is balanced");
            else
                System.out.println(" is not balanced");
        } catch(ArrayIndexOutOfBoundsException e){
            System.out.println("No string was given on the command line. ( usage: Java Balanced <string> )"); 
        }
        
        System.out.println("\nTESTS\n----------------");
        List<String> tests = Arrays.asList("()","({)}","(()()){}");
        for(String s : tests)
            System.out.println(s+" "+isBalanced(s));

    }
}
