/*
 * Programme qui implémente une pile à l'aide d'un
 * tableau permettant de stocker les éléments et
 * d'un entier représentant la frontière entre les
 * emplacements actuellement occupés par des éléments
 * précédemment poussés sur la pile et les emplacements
 * libre sur lesquels on poussera les futurs éléments.
 */
public class MaPile {
  // Le tableau stockant les éléments, capacité max. 1000
  public static int []tab = new int[1000];
  // La variable "frontière" entre les occupés et
  // les libres
  public static int premierLibre = 0;

  // Fonction d'affichage
  // On affiche tous les éléments compris entre celui
  // d'indice 0 et celui d'indice indiqué par la
  // variable "frontière"
  public static void affiche() {
    System.out.print('[');
    for (int i=0; i<premierLibre; i++) {
      System.out.print(tab[i]+",");
    }
    System.out.println(']');
  }

  // La pile est-elle vide ?
  // Elle est vide lorsque la "frontière" est l'élément
  // d'indice 0
  public static boolean estVide() {
    return premierLibre==0;
  }

  // Fonction d'empilement de la valeur passée en
  // paramètre.
  // On copie la valeur dans le premier emplacement
  // libre du tableau et on déplace d'un cran
  // la frontière.
  public static void empile(int valeur) {
    tab[premierLibre] = valeur;
    premierLibre++;
  }

  // Fonction de dépilement, la valeur dépilée est
  // renvoyée en retour.
  // Déplacement d'un cran en arrière de la frontière
  // et renvoie immédiat de la valeur qui est
  // stockée à cet emplacement devenu libre.
  public static int depile() {
    premierLibre--;
    return tab[premierLibre];
  }

  public static void main(String []args) {
    affiche();
    // pile.push(45);
    // tab[premierLibre] = 45;
    // premierLibre++;
    empile(45);
    affiche();
    // pile.push(88);
    // tab[premierLibre] = 88;
    // premierLibre++;
    empile(88);
    affiche();
    empile(99);
    affiche();
    while (!estVide()) {
      int i = depile();
      System.out.println("J'ai enlevé "+i);
      affiche();
    }

    // Mise en défaut de notre pile!
    // Notre pile a une capacité maximale....
    for (int i=0; i<100000; i++) empile(i);
  }
}