Bonjour ! Bienvenue dans cette nouvelle leçon.
Dans notre dernière session, nous avons exploré les matrices (tableaux à deux dimensions) et appris à les parcourir avec des boucles imbriquées pour effectuer des traitements comme la somme de deux matrices. Nous avons ainsi consolidé notre maîtrise des tableaux, qui sont des structures de données de taille fixe.
Aujourd'hui, nous allons changer de perspective et aborder une nouvelle catégorie de structures de données. L'objectif de cette leçon est de définir le concept de Pile (Stack), son principe de fonctionnement "Dernier Arrivé, Premier Sorti" (LIFO), et ses opérations fondamentales : empiler et dépiler. C'est votre première incursion dans le monde des structures de données dynamiques, dont la taille peut varier, et qui sont fondamentales en informatique.
1. Qu'est-ce qu'une Pile ?
Imaginez que vous rangiez une pile d'assiettes. Vous posez la première assiette, puis une deuxième par-dessus, puis une troisième. Quand vous voulez reprendre une assiette, laquelle prenez-vous ? Naturellement, celle du dessus, la dernière que vous avez posée. Vous ne pouvez pas retirer une assiette du milieu sans faire tomber toute la pile.
Une pile (en anglais, stack) en algorithmique fonctionne exactement sur ce même principe. C'est une structure de données où l'on ne peut ajouter ou retirer des éléments qu'à une seule extrémité, appelée le sommet de la pile.
Cette règle d'accès a une conséquence très importante : le dernier élément ajouté à la pile sera toujours le premier à en être retiré. C'est ce qu'on appelle le principe LIFO : Last-In, First-Out (Dernier Arrivé, Premier Sorti).
Pour approfondir cette définition et l'analogie, je vous invite à lire un court extrait d'un cours.
Structure : la pile — Algorithmique - CNRS
L'article "Structure : la pile" du CNRS explique très clairement ce principe de base et introduit la terminologie que nous allons utiliser.
Veuillez lire la section intitulée "Principe". Concentrez-vous sur l'analogie de la pile d'assiettes et la définition du principe LIFO. Notez bien les termes clés en français (pile, empiler, dépiler, sommet) et leurs équivalents en anglais (stack, push, pop, top).
2. Visualiser les opérations de base
Les deux opérations fondamentales d'une pile sont donc :
- Empiler (Push) : Ajouter un élément au sommet de la pile.
- Dépiler (Pop) : Retirer l'élément qui se trouve au sommet de la pile.
L'image suivante illustre parfaitement ce processus.

Analysons cette image ensemble :
- On part d'une pile vide.
Empiler(B): B est ajouté. Le sommet est B.Empiler(A): A est ajouté sur B. Le sommet est maintenant A.Empiler(E),Empiler(C),Empiler(D): Les éléments sont ajoutés successivement au sommet. Après ces opérations, le sommet est D.Dépiler(): L'élément au sommet, D, est retiré. Le nouveau sommet devient C.
Si on voulait dépiler à nouveau, on retirerait C, puis E, et ainsi de suite. L'ordre de sortie serait l'inverse de l'ordre d'entrée : D, C, E, A, B.
3. Les opérations fondamentales en détail
Au-delà d'empiler et dépiler, une gestion propre d'une pile nécessite quelques opérations supplémentaires pour vérifier son état et l'initialiser. Une bonne conception algorithmique, qui mène à un "code clean", doit toujours anticiper les cas d'erreur : que se passe-t-il si on essaie de dépiler une pile vide ?
Pour comprendre l'ensemble des opérations, nous allons nous baser sur une spécification formelle.
Structure : la pile — Algorithmique - CNRS
L'article du CNRS que nous avons vu précédemment propose une spécification claire des opérations d'une pile. Cela nous donne un "contrat" sur ce que chaque fonction doit faire.
Consultez la section "Spécification". Ne vous attardez pas sur la syntaxe qui ressemble à du code Python, mais concentrez-vous sur le nom de chaque opération et sa description (ce qu'elle prend en entrée et ce qu'elle fait en sortie).
Synthétisons ces opérations en pseudo-code standard.
-
CreerPile()- Rôle : Crée et retourne une nouvelle pile, initialement vide.
- Post-condition : La pile existe mais ne contient aucun élément.
-
PileVide(p : Pile) : Booleen- Rôle : Vérifie si la pile
pest vide. - Post-condition : Retourne
VRAIsipne contient aucun élément,FAUXsinon. - Utilisation : Essentiel avant de tenter de
Dépilerou de lire leSommet.
- Rôle : Vérifie si la pile
-
PilePleine(p : Pile) : Booleen- Rôle : Vérifie si la pile
pa atteint sa capacité maximale. Cette notion est surtout pertinente quand une pile est implémentée avec un tableau de taille fixe. - Post-condition : Retourne
VRAIsi on ne peut plus rien empiler,FAUXsinon. - Utilisation : Essentiel avant de tenter d'
Empiler.
- Rôle : Vérifie si la pile
-
Empiler(p : Pile, e : Element)- Rôle : Ajoute l'élément
eau sommet de la pilep. - Pré-condition : La pile
pne doit pas être pleine (PilePleine(p)estFAUX). - Post-condition :
eest le nouvel élément au sommet dep.
- Rôle : Ajoute l'élément
-
Dépiler(p : Pile)- Rôle : Retire l'élément au sommet de la pile
p. Certaines définitions précisent que cette opération retourne aussi l'élément retiré. Pour plus de clarté, nous séparons les rôles. - Pré-condition : La pile
pne doit pas être vide (PileVide(p)estFAUX). - Post-condition : L'élément qui était au sommet a été enlevé.
- Rôle : Retire l'élément au sommet de la pile
-
Sommet(p : Pile) : Element- Rôle : Retourne la valeur de l'élément au sommet de la pile
p, sans le retirer. - Pré-condition : La pile
pne doit pas être vide. - Post-condition : La valeur du sommet est retournée, mais la pile reste inchangée.
- Rôle : Retourne la valeur de l'élément au sommet de la pile
La gestion des erreurs (pré-conditions) est cruciale. Tenter d'empiler sur une pile pleine provoque un débordement (stack overflow), et tenter de dépiler d'une pile vide provoque un débordement négatif (stack underflow).
Le document suivant montre comment gérer ces erreurs dans le pseudo-code des opérations EMPILER et DEPILER.
Ce document PDF détaille le pseudo-code des opérations d'empilement et de dépilement, en incluant explicitement la gestion des erreurs de débordement. C'est un excellent exemple de conception algorithmique robuste.
Lisez la section 1.4 "Opérations EMPILER et DEPILER". Observez comment le pseudo-code vérifie si la pile est pleine ou vide avant d'effectuer l'opération. C'est une pratique essentielle pour écrire des algorithmes fiables.
4. Traçons l'exécution d'une pile
Pour bien assimiler le mécanisme, rien de tel qu'un traçage manuel. Suivons l'état d'une pile à travers une série d'opérations. Nous allons manipuler une pile de nombres entiers.
Séquence d'opérations :
CreerPile()Empiler(10)Empiler(25)Sommet()Dépiler()Empiler(40)Dépiler()Dépiler()PileVide()
| Opération | Description de l'action | État de la pile (Sommet → Base) | Sortie / Résultat retourné |
|---|---|---|---|
1. CreerPile() |
Initialisation d'une pile vide. | [] |
(Nouvelle pile vide) |
2. Empiler(10) |
Ajout de 10 au sommet. | [10] |
- |
3. Empiler(25) |
Ajout de 25 au sommet. | [25, 10] |
- |
4. Sommet() |
Lecture de l'élément au sommet. | [25, 10] |
25 |
5. Dépiler() |
Retrait de l'élément au sommet (25). | [10] |
- |
6. Empiler(40) |
Ajout de 40 au sommet. | [40, 10] |
- |
7. Dépiler() |
Retrait de l'élément au sommet (40). | [10] |
- |
8. Dépiler() |
Retrait de l'élément au sommet (10). | [] |
- |
9. PileVide() |
Vérification si la pile est vide. | [] |
VRAI |
Ce traçage montre comment la pile grandit et rétrécit, et comment le sommet change constamment, tout en respectant strictement la règle LIFO.
Conclusion
Aujourd'hui, nous avons découvert une structure de données fondamentale, la pile. Son concept est simple mais sa puissance est immense, comme nous le verrons dans les prochaines leçons.
Les points clés à retenir :
- Une pile (stack) est une structure de données basée sur le principe LIFO (Dernier Arrivé, Premier Sorti).
- Toutes les opérations (ajouts, suppressions) se font à une seule extrémité : le sommet.
- Les deux opérations principales sont
Empiler(ajouter au sommet) etDépiler(retirer du sommet). - D'autres opérations sont essentielles pour une utilisation robuste :
CreerPile,PileVide,PilePleine, etSommet. - Penser aux cas limites (pile vide ou pleine) est une étape cruciale vers l'écriture d'un algorithme "clean".
Et après ?
Maintenant que nous avons défini ce qu'est une pile et comment elle fonctionne, il est temps de la mettre en pratique. Dans la prochaine leçon, nous verrons notre premier cas d'utilisation concret : nous allons utiliser une pile pour résoudre un problème simple, celui d'inverser une chaîne de caractères. Vous verrez alors à quel point le principe LIFO est élégant pour résoudre ce type de défi.