Numérique et sciences informatiques (spécialité) · TerminaleBac
Piles et files : exercices corrigés de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Une pile fonctionne en LIFO : le dernier élément posé est le premier retiré ; une file fonctionne en FIFO : le premier arrivé est le premier servi 2.
- Les primitives d'une pile sont
is_empty,push(empiler) etpop(dépiler) 2. - Pour réussir un exercice de trace, dessine la structure après chaque opération et ne saute aucune ligne.
- Une file peut être réalisée avec deux piles : l'une reçoit les entrées, l'autre fournit les sorties 1.
Comment utiliser ces exercices
Ces exercices suivent la progression du cours : d'abord des traces à la main, puis de la programmation orientée objet, puis des usages plus fins des deux structures. Cherche chaque énoncé sur papier avant d'ouvrir les indices, puis compare ta démarche à la correction, étape par étape.
Tu as déjà rencontré les listes chaînées et la programmation orientée objet : ces deux notions servent ici, car on programme des classes et on raisonne sur des suites d'éléments.
Les exercices
Exercice 1 Trace sur une pile
On part d'une pile vide d'entiers. On exécute dans l'ordre :
empiler(4), empiler(7), depiler(), empiler(2), empiler(9), depiler(), depiler().
- Donne la liste des valeurs renvoyées par les trois appels à
depiler(). - Quel est le contenu final de la pile, sommet en dernier ?
- Calcule la somme des valeurs dépilées.
Indice 1
Écris la pile sous forme de liste et ajoute ou retire toujours à droite.
Indice 2
Le premier depiler() renvoie la valeur empilée juste avant lui.
Voir la correction pas à pas
Après
empiler(4)puisempiler(7): la pile vaut [4, 7], sommet à droite.Premier
depiler(): il renvoie 7, la pile vaut [4].empiler(2)puisempiler(9): la pile vaut [4, 2, 9].Deuxième
depiler(): il renvoie 9, la pile vaut [4, 2]. Troisièmedepiler(): il renvoie 2, la pile vaut [4].Les valeurs renvoyées sont donc 7, 9, 2 et la pile finale est [4].
Somme des valeurs dépilées : 7 + 9 + 2 = 18.
Les valeurs sortent dans un ordre qui dépend uniquement du moment où elles ont été posées, jamais de leur grandeur : c'est la marque du comportement LIFO 2.
Exercice 2 Trace sur une file
On part d'une file vide. On exécute :
enfiler(5), enfiler(8), enfiler(3), defiler(), enfiler(6), defiler().
- Quelles valeurs ont été renvoyées par les deux appels à
defiler()? - Écris le contenu final de la file, de la tête vers la queue.
- Calcule la somme des éléments restants dans la file.
Indice 1
Dans une file, on enfile à droite et on défile à gauche, si tu écris la tête à gauche.
Indice 2
Le premier arrivé est le premier sorti : regarde l'ordre des enfiler.
Voir la correction pas à pas
Après trois
enfiler: la file vaut [5, 8, 3], la tête est 5.Premier
defiler(): il renvoie 5, la file vaut [8, 3].enfiler(6): la file vaut [8, 3, 6].Deuxième
defiler(): il renvoie 8, la file vaut [3, 6].Les valeurs renvoyées sont 5 puis 8, dans l'ordre d'arrivée, et la file finale est [3, 6].
Somme des éléments restants : 3 + 6 = 9.
Les éléments sortent dans l'ordre exact où ils sont entrés : c'est le comportement FIFO 2.
Exercice 3 Pile ou file ?
Pour chaque situation, indique si la structure la plus adaptée est une pile ou une file, et justifie en une phrase.
- Le bouton « annuler » d'un éditeur de texte, qui défait les actions en commençant par la plus récente.
- Les documents envoyés à une imprimante partagée, imprimés dans l'ordre de leur envoi.
- Le contrôle des parenthèses d'une expression : chaque parenthèse fermante doit correspondre à la dernière ouvrante restée sans partenaire.
- Les clients d'un guichet, servis selon leur ordre d'arrivée.
Indice 1
Demande-toi quel élément doit sortir en premier : le plus récent ou le plus ancien ?
Voir la correction pas à pas
Situation 1 : l'action à défaire est toujours la dernière effectuée, donc c'est le plus récent qui sort en premier. Il faut une pile.
Situation 2 : le premier document envoyé doit être le premier imprimé. Il faut une file.
Situation 3 : la parenthèse fermante se compare à la dernière ouvrante non fermée, donc à la plus récente. Il faut une pile.
Situation 4 : le premier client arrivé est servi en premier, ce qui est le fonctionnement type d'une file 2. Il faut une file.
Le critère de choix est toujours le même : si le dernier arrivé doit sortir en premier, c'est une pile ; si le premier arrivé doit sortir en premier, c'est une file 2.
Exercice 4 Écrire une classe Pile
On veut réaliser une pile avec la programmation orientée objet, en s'appuyant sur une liste Python.
- Écris une classe
Pileavec un constructeur créant une pile vide et les méthodesest_vide,empileretdepiler. Le sommet est le dernier élément de la liste.depilerdoit lever une erreur claire si la pile est vide. - Écris une fonction
inverser(liste)qui renvoie une nouvelle liste contenant les éléments dans l'ordre inverse, en n'utilisant que les trois méthodes de la classe.
Indice 1
Pour l'inversion, empile tous les éléments dans l'ordre, puis dépile-les un par un.
Indice 2
La méthode append d'une liste ajoute en fin, pop() sans argument retire le dernier élément.
Voir la correction pas à pas
On stocke les éléments dans un attribut
contenu, liste initialement vide. L'ajout et le retrait se font à la fin de la liste, donc à coût faible.est_viderenvoielen(self.contenu) == 0.empilerappelleself.contenu.append(x).depilervérifie d'abordest_vide, lèveIndexErroravec un message si besoin, sinon renvoieself.contenu.pop().Pour
inverser, on empile chaque élément de la liste, puis on dépile jusqu'à ce que la pile soit vide en ajoutant chaque valeur à la liste résultat. Le dernier empilé sort le premier : l'ordre est renversé.Code complet :
class Pile: def __init__(self): self.contenu = [] def est_vide(self): return len(self.contenu) == 0 def empiler(self, x): self.contenu.append(x) def depiler(self): if self.est_vide(): raise IndexError("pile vide") return self.contenu.pop() def inverser(liste): p = Pile() for x in liste: p.empiler(x) resultat = [] while not p.est_vide(): resultat.append(p.depiler()) return resultat
La classe n'expose que les trois primitives d'une pile 2 ; l'utilisateur ignore que le stockage est une liste, ce qui permet de changer l'implémentation sans modifier le reste du programme.
Exercice 5 Expression bien parenthésée
On considère des chaînes contenant les caractères (, ), [, ], {, } et d'autres symboles ignorés. Une chaîne est bien parenthésée si chaque symbole fermant correspond au dernier symbole ouvrant encore en attente, et si plus aucun ouvrant n'est en attente à la fin.
- Écris une fonction
bien_parenthese(s)qui utilise la classePilede l'exercice précédent. - Déroule-la sur
"{[()]}"puis sur"([)]".
Indice 1
Empile chaque ouvrant. Pour un fermant, dépile et compare avec l'ouvrant attendu.
Indice 2
Pense à deux cas d'échec : fermant sur pile vide, et ouvrants restants à la fin.
Voir la correction pas à pas
On définit un dictionnaire associant chaque fermant à son ouvrant :
{")": "(", "]": "[", "}": "{"}.On parcourt la chaîne. Un ouvrant est empilé.
Pour un fermant : si la pile est vide, la réponse est
False; sinon on dépile et on compare avec l'ouvrant associé,Falseen cas de différence.À la fin du parcours, la chaîne est correcte si et seulement si la pile est vide.
Code :
def bien_parenthese(s): couples = {")": "(", "]": "[", "}": "{"} p = Pile() for c in s: if c in "([{": p.empiler(c) elif c in couples: if p.est_vide() or p.depiler() != couples[c]: return False return p.est_vide()Trace sur
"{[()]}": on empile{,[,(. Le)dépile(: correct. Le]dépile[: correct. Le}dépile{: correct. La pile est vide, doncTrue.Trace sur
"([)]": on empile(puis[. Le)dépile[, qui n'est pas(: la fonction renvoieFalseaussitôt.
Une pile convient parce que le fermant doit toujours être comparé à l'ouvrant le plus récent : c'est exactement le dernier élément posé, premier retiré 2.
Exercice 6 Une file avec deux piles
Une file peut être réalisée avec deux piles 1. Le principe retenu ici : une pile entree reçoit les éléments enfilés ; une pile sortie fournit les éléments défilés. Quand sortie est vide et qu'on défile, on dépile tous les éléments de entree pour les empiler dans sortie, puis on dépile sortie.
On part de deux piles vides et on exécute : enfiler(1), enfiler(2), enfiler(3), defiler(), enfiler(4), defiler(), defiler(), defiler().
- Donne les valeurs renvoyées par les quatre
defiler(). - Compte le nombre total d'éléments déplacés de
entreeverssortie.
Indice 1
Un transfert inverse l'ordre des éléments : le sommet de entree devient le fond de sortie.
Indice 2
Ne transfère que lorsque sortie est vide.
Voir la correction pas à pas
Après trois
enfiler:entree= [1, 2, 3] (sommet à droite),sortieest vide.Premier
defiler():sortieest vide, on transfère. On dépile 3, 2, 1 deentreeet on les empile dans cet ordre :sortie= [3, 2, 1], sommet 1. Trois éléments déplacés. On dépilesortie: valeur renvoyée 1.enfiler(4):entree= [4],sortie= [3, 2].Deuxième
defiler():sortien'est pas vide, aucun transfert. Valeur renvoyée 2.Troisième
defiler(): valeur renvoyée 3,sortieest maintenant vide.Quatrième
defiler():sortieest vide, on transfère l'élément 4 (un déplacement) puis on le dépile : valeur renvoyée 4.Valeurs renvoyées : 1, 2, 3, 4, soit l'ordre d'arrivée. Déplacements : 3 + 1 = 4.
Deux inversions successives rétablissent l'ordre d'origine : c'est ce qui transforme deux piles, chacune LIFO, en une file FIFO 2.
Exercice 7 Évaluer une expression en notation postfixée
En notation postfixée, l'opérateur est écrit après ses deux opérandes. Pour évaluer une expression, on la lit de gauche à droite avec une pile de nombres : un nombre est empilé ; pour un opérateur, on dépile d'abord le second opérande, puis le premier, on calcule, et on empile le résultat.
Évalue l'expression 3 4 + 2 * 7 -.
- Donne l'état de la pile après chaque symbole.
- Écris l'expression en notation habituelle avec parenthèses.
- Donne le résultat final.
Indice 1
Pour la soustraction, le premier dépilé est le second opérande : fais attention à l'ordre.
Indice 2
La pile ne doit contenir qu'un seul élément à la fin.
Voir la correction pas à pas
3: pile [3].4: pile [3, 4].+: on dépile 4 puis 3, on calcule 3 + 4 = 7, on empile : [7].2: pile [7, 2].*: on dépile 2 puis 7, on calcule 7 × 2 = 14, on empile : [14].7: pile [14, 7].-: on dépile 7 (second opérande) puis 14 (premier), on calcule 14 − 7 = 7, on empile : [7].En notation habituelle : .
Résultat : la pile ne contient plus que 7.
La pile garde en attente les opérandes déjà lus et rend toujours le plus récent en premier, selon le modèle LIFO 2. L'ordre d'écriture suffit donc à fixer l'ordre des calculs, sans parenthèses.
Exercice 8 Coût d'une file à deux piles
On réalise une file avec deux piles entree et sortie comme dans l'exercice « Une file avec deux piles ». On enfile éléments, puis on les défile tous. On compte comme opération élémentaire chaque appel à empiler ou depiler sur l'une des deux piles.
- Combien d'opérations élémentaires sont effectuées pour les 50
enfiler? - Combien pour le transfert déclenché par le premier
defiler()? - Combien pour dépiler les 50 éléments de
sortie? - Donne le total, puis le nombre moyen d'opérations par élément.
Indice 1
Un transfert d'un élément coûte un depiler sur entree et un empiler sur sortie.
Indice 2
Chaque élément n'est transféré qu'une seule fois.
Voir la correction pas à pas
Chaque
enfilerest unempilersurentree: 50 opérations.Le transfert déplace 50 éléments, chacun coûtant un
depileret unempiler: 50 + 50 = 100 opérations.Les 50
defilersuivants sont de simplesdepilersursortie: 50 opérations, sans nouveau transfert puisquesortien'est jamais vide avant la fin.Total : 50 + 100 + 50 = 200 opérations.
Moyenne : 200 / 50 = 4 opérations par élément, quel que soit .
Même si un seul defiler peut être long, le coût moyen par élément reste constant : chaque élément subit au plus quatre opérations. Cette façon de réaliser une file avec deux piles 1 est donc efficace en moyenne.
Les questions qu'on se pose
Pourquoi ne pas simplement utiliser une liste Python partout ?
Une liste permet d'accéder à n'importe quelle position, ce qui masque l'intention. Une pile ou une file restreint volontairement les opérations : en lisant empiler et depiler, on sait que seul le dernier élément posé est concerné 2. Ce contrat rend le programme plus lisible et moins sujet aux erreurs, et l'implémentation interne peut changer sans toucher au reste du code.
Que se passe-t-il si je dépile une pile vide ?
Il n'y a aucun élément à renvoyer : l'opération n'a pas de sens. C'est pourquoi la primitive is_empty existe 2. Dans ta classe, tu dois soit tester est_vide avant chaque depiler, soit lever une erreur explicite dans depiler pour signaler le problème au lieu de continuer avec une valeur absurde.
Pourquoi construit-on une file avec deux piles alors qu'on peut la programmer directement ?
C'est un exercice de raisonnement sur les structures : il montre qu'une structure FIFO peut se déduire d'une structure LIFO 1. Il faut surtout comprendre le mécanisme : le transfert d'une pile vers l'autre inverse l'ordre, et deux inversions redonnent l'ordre d'arrivée. Cette idée de réutiliser une structure existante revient souvent dans les sujets.
Sources
- Document accompagnement - Structures de données (Listes, Piles, Files), Éduscol / Ministère de l'Éducation nationale. Consulté le 7 novembre 2026.
- Structures de données - Terminale NSI, CNRS - Enseignements de mathématiques. Consulté le 7 novembre 2026.
- Pile Zoé, Wikipédia. Consulté le 7 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.