import java.io.*;
//import java.util.Stack;

public class Checker {
    public Stack stack;
    
    public Checker () {
	stack = new Stack ();
    }
    
    
    public void checkLine (String line) {
	// traverse the given String and handle special characters
	
	System.out.println (line);
	for (int i = 0; i<line.length(); i++) {
	    char c = line.charAt (i);
	    
	    // if the character is an opener, push it on the stack
	    // if it's a closer, check it by calling checkCloser
	    switch (c) {
	    case '{': case '(': case '[':
		stack.push (new Character (c));
		break;
	    case '}': case ')': case ']':
		checkCloser (c);
		break;
	    default:
                // ignore all other characters
	    }
	}
    }
    
    public void endOfInput () {
	// when we get to the end of the file, make sure the stack is empty
	
	if (stack.empty()) {
	    System.out.println ("All is well.");
	} else {
	    System.out.println ("Unbalanced (extra opener on stack)");
	}
    }

    private boolean match (char opener, char closer) {
	switch (closer) {
	case '}':
	    return (opener == '{');
	case ')':
	    return (opener == '(');
	case ']':
	    return (opener == '[');
	}
	return true;
    }    
    
    private void checkCloser (char closer) {
	if (stack.empty()) {
	    System.out.println ("Unbalanced (stack empty)");
	    System.exit (1);
	}
	char opener = ((Character) stack.pop()).charValue();
	if (!match (opener, closer)) {
	    System.out.println ("Unbalanced (wrong closer)");
	    System.exit (1);
	}
    }
}
