On a vu au § 1.6, page que les cadres d'invocation des méthodes sont des blocs de mémoire << empilés >> les uns sur les autres, le dernier empilé étant le premier retiré (en anglais last in, first out ou LIFO), comme une vulgaire pile d'assiettes. Les piles permettent également de parcourir un graphe en profondeur sans récursivité. La figure 2.11 montre le fonctionnement d'une pile. Les quatre opérations sur une pile sont : ajouter un élément au sommet de la pile (ou empiler), lire la valeur se trouvant au sommet d'une pile non-vide, tester si une pile est vide, retirer l'élément au sommet de la pile (ou dépiler). En anglais, << pile >> se dit stack et les opérations portent respectivement les noms push, top, isEmpty, pop. Voici l'interface des piles, en Java :
interface Pile { boolean estVide(); void empiler(Object o); Object sommet(); Object dépiler(); }
On va implémenter les piles en utilisant les fonctionnalités des listes et leur implémentation sous forme de tableau fournie par l'API Java :
import java.util.List; import java.util.ArrayList; class PileParListe implements Pile { private List contenu; PileParListe() { contenu = new ArrayList(); } public boolean estVide() { return contenu.isEmpty(); } public void empiler(Object o) { contenu.add(o); } public Object sommet() { return contenu.get(contenu.size()-1); } public Object dépiler() { return contenu.remove(contenu.size()-1); } }