/**
 * On réalise (implémente) une pile à l'aide d'un tableau (taille fixe
 * donc capacité limitée pour la pile).
 * Le tableau est donc logiquement (logiciellement) coupé en deux parties.
 * Les premières cases qui contiennent dans l'ordre les éléments empilés,
 * les cases qui suivent (les dernières donc) sont simplement des
 * réceptacles (emplacements) pour les futurs valeurs qui seront empilés.
 * Le découpage est obtenu à l'aide d'une variable annexe qui est
 * l'indice du tableau correspondant à la coupure logique.
 */
public class Pile {
  static int []tableau = new int[100]; // On essaie avec 100 entiers...
  static int sommetDePile = 0; // La « coupure », indice du premier emplacement « vide »
  /**
   * Une fonction permettant d'afficher la partie utile de la pile
   */
  public static void affichePile() {
    System.out.print("Il y a "+sommetDePile+" éléments dans la pile :");
    for (int i=0; i<sommetDePile; i++) System.out.print(tableau[i]+":");
    System.out.println();
  }
  public static void main(String []a) {
    affichePile();

    // push(1) : on simule un push
    tableau[sommetDePile] = 1;
    sommetDePile++;
    affichePile();

    // push(10) : on simule un autre push
    tableau[sommetDePile] = 10;
    sommetDePile++;
    affichePile();

    // pop : on simule un pop
    sommetDePile--;
    int valeur = tableau[sommetDePile];
    affichePile();

    // afichage du résultat...
    System.out.println("Il y avait "+valeur+" en sommet de pile");

    // utilisation des fonctions annexes push/pop (voir plus bas)
    push(23);
    System.out.println("Il y avait "+pop()+" en sommet de pile");
  }
  /**
   * On peut donc écrire les opérations d'empilement/dépilement comme
   * fonctions
   */
  public static void push(int v) {
    tableau[sommetDePile] = v;
    sommetDePile++;
  }
  public static int pop() {
    sommetDePile--;
    return tableau[sommetDePile];
  }
}