/**
* Version 2. On ne repete pas le même code.
* On teste si parenthèse ouvrante ([{< ou  fermante >}])
**/

import java.lang.*;

public class TestPileParenthese2 {
    static String s = "(())[{}]#";      // Une chaîne à tester
    static String ouvrante ="([{<";     // Ensemble de caractères ouvrants
    static String fermante =")]}>";     // Ensemble de caractères fermants
    
    static public void main(String args[]) {
        char c; int i=0; boolean ok = true;

        Pile p = new Pile();

        while ((c = s.charAt(i++)) != '#') {
            // Difference ici 
            if (ouvrante.indexOf(c)!= -1)
                p.empiler(c);       // On empile un caractère ouvrant
            else if (fermante.indexOf(c) != -1)
                    if (p.estVide()) {  // !parenthèse fermante en trop
                        erreur ("ERREUR! parenthèse fermante en trop " + c );
                        ok = false; break;
                    }
                    else if (compare (c, p.sommet() )) // même type, on dépile.
                        p.depiler();
                    else {  // !parenthèses de types différents
                        erreur ("ERREUR! parenthèses de types différents: " + c);
                        ok = false; break;
                    }
            // Autrement c'est un autre caractère...
        }
        
        if (ok)
            if (p.estVide())
                System.out.println ("OK, bien parenthesee");
            else erreur ("ERREUR! parenthèse ouvrante en trop:" + p.sommet());
        else;
    }
    
    static boolean compare (char a, char b){
        return fermante.indexOf(a) == ouvrante.indexOf(b);
    }
    
    static void erreur(String s) {
        System.out.println (s);
    }
}
