Un cap pour ce chapitre
Ce que vous saurez faire
- Décrire les opérations d’une pile.
- Exécuter empilements et dépilements.
- Utiliser une pile pour vérifier des délimiteurs imbriqués.
Les bases utiles pour commencer
Une seule extrémité accessible
Une pile est une structure linéaire dont les ajouts et retraits se font au même endroit, appelé sommet. Empiler ajoute un élément au sommet. Dépiler retire et renvoie celui qui s’y trouve. Le dernier élément entré est donc le premier sorti : Last In, First Out, ou LIFO.
L’interface comporte aussi un test de vacuité et éventuellement une consultation du sommet sans retrait. Une pile vide ne possède pas de sommet. Le contrat doit préciser ce qui arrive lors d’un retrait à vide : précondition à respecter ou erreur documentée. Renvoyer arbitrairement zéro serait ambigu si zéro est une donnée possible.
LIFO exprime une contrainte sur l’ordre des opérations observables. Une pile peut être dessinée verticalement ou horizontalement, et son sommet peut être placé à gauche ou à droite. Ce qui compte est que l’élément ajouté le plus récemment parmi ceux encore présents soit le prochain retiré. Le contrat ne demande ni un tri des valeurs, ni la conservation d’un ordre d’arrivée à la sortie.
Une réalisation simple en Python
Une liste Python peut représenter une pile dont le sommet est à droite. append empile et pop() dépile le dernier élément. Si l’on adopte une autre convention graphique, il faut l’annoncer. Le sens LIFO dépend des opérations, pas de la manière dont le dessin est orienté sur la page.
Empiler A, B puis C donne [A, B, C], avec C au sommet. Deux dépilements renvoient C puis B et laissent [A]. Consulter A ne le retire pas. Une trace utile sépare donc les valeurs renvoyées du contenu encore conservé dans la pile.
pile = []
pile.append("A")
pile.append("B")
pile.append("C")
dernier = pile.pop() # "C"
sommet = pile[-1] # "B", toujours présentVérifier un emboîtement de délimiteurs
Pour vérifier des parenthèses, crochets et accolades, on lit le texte de gauche à droite. Une ouverture est empilée. À la rencontre d’une fermeture, la pile doit être non vide et son sommet doit être l’ouverture correspondante. On la dépile alors. À la fin, la pile doit être vide.
L’expression ([ ]) est correcte : le crochet, ouvert le plus récemment, se ferme avant la parenthèse. En revanche ([)] est incorrecte, même si chaque type possède autant d’ouvertures que de fermetures. Compter ne vérifie pas l’ordre d’imbrication ; la pile le mémorise.
Le contenu de la pile est un résumé du préfixe déjà lu : il contient les ouvertures qui attendent encore leur fermeture, dans leur ordre d’apparition. Le sommet est donc la dernière ouverture non refermée. Cette propriété explique le bon choix de structure et permet de justifier l’algorithme, au-delà de la simple analogie avec une pile d’assiettes.
Trois erreurs différentes à diagnostiquer
Une fermeture sur pile vide signifie qu’aucune ouverture ne lui correspond. Une fermeture incompatible avec le sommet révèle un mauvais emboîtement. Une pile encore remplie à la fin indique des ouvertures jamais refermées. Ces diagnostics aident à comprendre un échec au lieu d’afficher seulement « faux ».
Chaque caractère est lu une fois et chaque délimiteur est empilé puis éventuellement dépilé. Le coût du parcours est linéaire dans ce modèle. La mémoire nécessaire dépend du nombre maximal d’ouvertures simultanément en attente. L’atelier ignore les autres caractères : il illustre l’emboîtement, sans analyser toute la syntaxe d’un langage.
Exemple suivi : distinguer trois diagnostics
Pour ([{}]), les trois premières lectures empilent parenthèse, crochet, accolade. Le sommet est alors l’accolade ; les trois fermetures dépilent dans l’ordre inverse. La pile finale est vide et le texte est correct. Sa profondeur maximale est trois, même si la taille finale vaut zéro.
Pour ([)], le premier échec arrive à l’indice 2 : la fermeture de parenthèse rencontre un crochet au sommet. Pour ()), la dernière fermeture rencontre une pile vide. Pour ((), aucune fermeture ne provoque d’erreur, mais une ouverture reste à la fin. Ces diagnostics ne se corrigent pas de la même façon. Un bon vérificateur doit donc distinguer incompatibilité, fermeture sans ouverture et ouverture restant en attente.
Transférer l’idée à une fonction annuler
Une application simplifiée mémorise dans une pile les opérations réversibles effectuées : écrire A, écrire B, écrire C. Annuler retire la plus récente, donc C, puis B au prochain appel. Cette discipline correspond au besoin de revenir en arrière dans l’ordre inverse de construction. Une file ferait annuler A d’abord et ne suivrait pas ce contrat.
Pour un exercice autonome, précisez ce qu’une opération enregistre et comment elle s’inverse. Une pile de lettres suffit à modéliser l’ajout de caractères, mais ne décrit pas toutes les possibilités d’un traitement de texte. Si une fonction rétablir est ajoutée, une seconde pile peut mémoriser les opérations annulées ; ses règles doivent être spécifiées, notamment lorsqu’une nouvelle modification arrive. L’intérêt de la structure provient des opérations attendues, pas du nom de l’application.
À vous de faire varier les choses
Le détecteur d’emboîtements
Saisissez jusqu’à trente caractères et avancez leur lecture. Testez un mauvais ordre, une fermeture en trop et une ouverture oubliée.
Lire le résultat de l’expérience initiale
État : en cours
Le sommet est à droite. Les caractères autres que les délimiteurs sont ignorés.
| Indice | Caractère | Action | Pile après | Profondeur après | Maximum observé |
|---|---|---|---|---|---|
| 0 | ( | Empiler | ( | 1 | 1 |
| 1 | [ | Empiler | ( [ | 2 | 2 |
| 2 | { | Empiler | ( [ { | 3 | 3 |
Le dernier délimiteur ouvert doit être le premier refermé.
De la compréhension à l’autonomie
À vous de résoudre
Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.
Suivre le sommet
Une pile vide reçoit 4, 7 puis 2. On dépile, on empile 9 puis on dépile encore. Donnez les deux sorties et le contenu final, sommet à droite.
Indice 1
La première sortie est le dernier élément empilé jusque-là.
Indice 2
L’ajout de 9 ne remet pas 2 dans la pile.
Comprendre la correction
Les sorties sont 2 puis 9. La pile finale est [4, 7], avec 7 au sommet. Les valeurs dépilées ne sont plus présentes. Écrire les sorties dans une colonne distincte évite de les confondre avec les données encore stockées.
Autant de symboles ne suffit pas
Pourquoi ([)] est-elle refusée malgré deux ouvertures et deux fermetures ? Précisez le premier point d’échec.
Indice 1
Après les deux ouvertures, le sommet contient un crochet.
Indice 2
La troisième marque est une parenthèse fermante.
Comprendre la correction
Au troisième caractère, la fermeture ) rencontre [ au sommet. La dernière ouverture attend donc ], pas ). Les quantités globales sont correctes, mais l’ordre d’imbrication est incompatible. La pile permet précisément de vérifier cette information que le comptage perd.
Un test final oublié
Un vérificateur rejette les fermetures incorrectes mais accepte dès qu’il atteint la fin. Pourquoi accepte-t-il à tort (() ?
Indice 1
Une ouverture peut rester sans fermeture.
Indice 2
Observez la pile après le dernier caractère.
Comprendre la correction
Après (() , il reste une parenthèse ouvrante dans la pile. Aucun mauvais dépilement n’a eu lieu, mais une ouverture n’a jamais été fermée. Le résultat doit vérifier à la fois l’absence d’erreur pendant le parcours et la vacuité finale de la pile.
La mémoire suit la profondeur
Comparez la taille maximale de pile pour ()()() et ((())). Les textes ont la même longueur : la mémoire maximale est-elle identique ?
Indice 1
Dans le premier texte, chaque ouverture est immédiatement refermée.
Indice 2
Dans le second, trois ouvertures s’accumulent.
Comprendre la correction
La taille maximale est 1 pour ()()() et 3 pour ((())). Les deux textes demandent six lectures, mais leurs profondeurs d’imbrication diffèrent. Le coût en temps et la mémoire maximale utilisée ne décrivent donc pas la même propriété de l’exécution.
Une trace d’emboîtement
Suivez {[()]} caractère par caractère. Donnez le contenu de pile après les trois premières lectures, après la quatrième, puis à la fin. Indiquez profondeur maximale et diagnostic final.
Indice 1
Le sommet est à droite.
Indice 2
Une fermeture correcte retire seulement l’ouverture correspondante.
Comprendre la correction
Après trois lectures, la pile contient { puis [ puis (. Après la quatrième, la parenthèse est retirée et il reste { puis [. Les deux dernières fermetures vident la pile. La profondeur maximale est 3 et le diagnostic est correct. La taille finale n’indique pas la mémoire maximale utilisée.
Le premier échec utile
Pour [)(], donnez l’indice du premier échec avec des indices commençant à zéro, le sommet attendu et la fermeture qui aurait convenu. Pourquoi compter deux ouvertures et deux fermetures ne suffit-il pas ?
Indice 1
La deuxième lecture est déjà incompatible.
Indice 2
La dernière ouverture non refermée détermine le type de fermeture.
Comprendre la correction
L’échec survient à l’indice 1 : ) ne correspond pas au crochet [ au sommet. Il aurait fallu ]. Les quantités totales ne vérifient pas l’ordre d’emboîtement. Continuer à compter ne répare pas cette incompatibilité déjà établie.
Annuler un texte
Un modèle ajoute successivement les lettres A,B,C. Une pile conserve les ajouts. On annule deux fois, ajoute D, puis annule une fois. Donnez les opérations retirées et le texte final. Expliquez pourquoi le dernier ajout D doit sortir avant A.
Indice 1
Annuler suit l’ordre inverse parmi les opérations encore actives.
Indice 2
Une nouvelle opération devient le sommet.
Comprendre la correction
Les annulations retirent C, puis B, puis D. Le texte final contient seulement A. D devient l’opération la plus récente au moment de son ajout, donc la prochaine à annuler. La pile exprime ce contrat LIFO sans avoir à rechercher la date de chaque opération.
Les erreurs qui méritent un détour
- Dépiler pour simplement regarder le sommet.
- Consulter doit laisser la structure intacte. Un retrait modifie l’état et peut faire disparaître une information nécessaire.
- Tester seulement le nombre d’ouvertures et de fermetures.
- L’ordre et le type des délimiteurs comptent aussi ; une pile mémorise les ouvertures en attente.
La fiche à garder
L’essentiel à retenir
- Une pile applique l’ordre LIFO.
- Empiler, consulter et dépiler ont des effets différents.
- Une pile vide à la fin ne suffit que si aucune erreur intermédiaire n’a été ignorée.
Cette notion au bac
Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.
Le prochain pas
- Les files : comprendre le fonctionnement FIFO
- La récursivité : comprendre les appels et les résultats
- Parcourir un graphe en profondeur : DFS
Retrouver le catalogue de Terminale
Ce chapitre s’appuie sur le programme officiel de Terminale (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.
