programmation Java (école d'ingénieur) · Chapitre 7 · Exercice de TD
Une pile qui grandit
Classes et objets · niveau 3 (difficile)
Énoncé
Une pile est une collection où l'on ajoute (empiler) et retire (dépiler) toujours au même bout, comme une pile d'assiettes. Écrire une classe Pile d'entiers, avec un attribut tableau elements (de capacité initiale ) et un attribut taille, les éléments occupant les cases , et les méthodes estVide(), empiler(int v), depiler() et sommet(). Quand le tableau est plein, empiler le remplace par un tableau deux fois plus grand. Empiler les carrés de à , puis tout dépiler en affichant les valeurs. Quelle est la capacité finale du tableau ?
Corrigé
L'attribut taille est à la fois le nombre d'éléments et l'indice de la prochaine case libre. Quand le tableau est plein, on en crée un deux fois plus grand, on y recopie les éléments, et l'attribut désigne désormais le nouveau tableau.
class Pile {
int[] elements = new int[2];
int taille = 0; // les éléments sont dans elements[0 : taille)
boolean estVide() { return taille == 0; }
void empiler(int v) {
if (taille == elements.length) { // plein : on double la capacité
int[] plusGrand = new int[2 * elements.length];
for (int i = 0; i < taille; i++) plusGrand[i] = elements[i];
elements = plusGrand;
}
elements[taille] = v;
taille++;
}
int depiler() { // précondition : la pile n'est pas vide
taille--;
return elements[taille];
}
int sommet() { return elements[taille - 1]; }
}
public class Ex11Pile {
public static void main(String[] args) {
Pile p = new Pile();
for (int i = 1; i <= 5; i++) p.empiler(i * i);
System.out.println("capacité : " + p.elements.length + ", taille : " + p.taille);
System.out.print("dépilés :");
while (!p.estVide()) System.out.print(" " + p.depiler());
System.out.println();
}
}
capacité : 8, taille : 5
dépilés : 25 16 9 4 1
La capacité passe de à au troisième élément, puis à au cinquième. Les éléments ressortent dans l'ordre inverse de leur arrivée : le dernier empilé est le premier dépilé. Doubler la capacité, plutôt que l'augmenter d'une case, garantit que le coût total des recopies reste proportionnel au nombre d'éléments empilés ; c'est ce que fait la classe ArrayList de la bibliothèque (chapitre 12).
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.