Prepa Help
Prepa Help › Cours › Informatique, 1re année

Piles, files et deques en Python : cours et exercices corrigés

Structures de données abstraites pile et file, implémentation par une liste Python (append, pop) et par deque, opérations et coûts, applications classiques : parenthèses bien formées, évaluation d'une expression postfixée, file d'attente, parcours.

Les nombres sont ceux du chapitre complet ; chaque filière voit la partie qui correspond à son programme.

Une pile fait sortir le dernier élément entré (LIFO) : en Python, c'est une liste dont le sommet est en fin, avec append pour empiler et pop() pour dépiler, chacun en temps constant. Une file fait sortir le premier entré (FIFO) : par une liste, défiler par pop(0) fait glisser tous les autres éléments, et vider une file de nn éléments coûte n(n−1)2\frac{n(n-1)}{2} décalages, soit 499 500 pour mille éléments ; une deque du module collections, avec append et popleft, défile en temps constant. Ce chapitre d'informatique commune de première année, au programme de MPSI, PCSI, PTSI, TSI et TPC, au Maroc et en France, définit ces structures par leur interface, puis traite les applications classiques : vérification des parenthèses, évaluation d'une expression postfixée, simulation d'une file d'attente, file avec deux piles, pile à la place de la récursion. Les exercices et problèmes reprennent des questions des sujets du CNC, de CCINP, de Mines-Ponts, de Centrale-Supélec et de X-ENS. En France, pop(0) et deque sont hors de l'annexe du programme : un sujet qui s'en sert les documente.

Ce que tu sauras faire

À la saison des dattes, les camions attendent le pont-bascule dans l'ordre de leur arrivée, et les caisses pesées s'empilent dans la salle de stockage. Deux règles de sortie différentes, deux structures de données : la file et la pile. Elles servent partout, des calculs d'une calculatrice à la pile d'appels de Python, et les sujets les demandent souvent. À la fin de ce chapitre, tu dois savoir :

L'essentiel : Implémentations et coûts Extrait gratuit

Un extrait de la fiche « L'essentiel » du chapitre. Les démonstrations sont dans le cours détaillé.

implémentation ajouter retirer vider nn éléments
pile par liste, sommet en fin (append, pop()) O(1)O(1) O(1)O(1) O(n)O(n)
file par liste (append, pop(0)) O(1)O(1) O(k)O(k) pour kk éléments O(n2)O(n^2)
file par deque (append, popleft) O(1)O(1) O(1)O(1) O(n)O(n)
file circulaire de capacité fixe O(1)O(1) O(1)O(1) O(n)O(n)
file par deux piles O(1)O(1) O(1)O(1) en moyenne sur une suite d'opérations O(n)O(n)
  • pop(0) fait glisser tous les autres éléments : k−1k - 1 décalages pour une file de kk éléments, n(n−1)2\frac{n(n-1)}{2} pour vider une file de nn éléments.
  • Une deque (from collections import deque) ajoute et retire aux deux bouts en temps constant : append, appendleft, pop, popleft, len. En file : append et popleft. En pile : append et pop.
def creer_pile():
    # pile vide
    return []

def est_vide(P):
    # True si P est vide
    return len(P) == 0

def empiler(P, x):
    # x au sommet de P
    P.append(x)

def depiler(P):
    # P non vide ; retire et renvoie le sommet
    assert not est_vide(P)
    return P.pop()

def sommet(P):
    # P non vide ; renvoie le sommet sans le retirer
    assert not est_vide(P)
    return P[len(P) - 1]

Une méthode du chapitre Extrait gratuit

Un exercice corrigé Extrait gratuit

Dans le chapitre complet

Le cours détaillé, toute la fiche « L'essentiel », 14 méthodes, 15 pièges corrigés, la carte mentale, 30 exercices corrigés, 4 problèmes de concours, les fiches à mémoriser et l'assistant qui répond à tes questions. Les trois premiers chapitres de chaque matière sont offerts avec un compte d’essai gratuit.

Ouvrir l'essai gratuitVoir les offres

Plan du cours

Les méthodes du chapitre

Chaque méthode est une fiche : quand l'utiliser, le rappel de cours, les étapes, la rédaction attendue sur la copie, un exemple traité, les erreurs à éviter.

  1. Choisir entre pile, file et deque
  2. Écrire les primitives d'une pile par une liste
  3. Écrire les primitives d'une file par une liste, puis par une deque
  4. Simuler à la main une suite d'opérations
  5. Respecter l'interface imposée par un sujet
  6. Parcourir une pile sans la détruire
  7. Vérifier un parenthésage et retrouver les couples
  8. Évaluer une expression postfixée
  9. Prouver un algorithme à pile
  10. Justifier le coût des opérations et d'une boucle
  11. Simuler une file d'attente
  12. Remplacer une récursion par une pile explicite
  13. Implémenter une pile bornée et une file circulaire
  14. Implémenter une file avec deux piles

Les exercices corrigés

Chaque exercice a ses indications, sa correction rédigée et ce qu'il faut en retenir.

Application directe (12)

Entraînement (14)

Approfondissement (4)

Les problèmes de concours

Des extraits de sujets réels, corrigés en entier, avec la durée conseillée et les méthodes mobilisées.

Questions fréquentes

Comment implémenter une pile en Python ?

Par une liste dont le sommet est le dernier élément : creer_pile() renvoie [], est_vide(P) teste len(P) == 0, empiler(P, x) fait P.append(x), depiler(P) renvoie P.pop() et sommet(P) renvoie P[len(P) - 1]. Dépiler une pile vide ou lire son sommet n'a pas de sens : depiler et sommet vérifient la précondition par assert not est_vide(P). Chaque opération se fait en temps constant, quelle que soit la hauteur de la pile. Mettre le sommet en tête, avec insert(0, x) et pop(0), donnerait des résultats justes, mais chaque opération déplacerait tous les autres éléments. Au programme marocain, le sommet s'écrit aussi P[-1].

Quelle différence entre une pile et une file ?

Une pile fait sortir le dernier entré, comme des caisses posées les unes sur les autres : on ajoute et l'on retire au sommet, en anglais LIFO (last in, first out). Une file fait sortir le premier entré, comme des camions qui attendent leur pesée : on ajoute en queue et l'on retire en tête, en anglais FIFO (first in, first out). Les opérations se correspondent : empiler et enfiler, depiler et defiler, sommet et tete. Ces structures se définissent par leur interface, le nom, les paramètres, la précondition et la valeur renvoyée de chaque opération ; un programme qui n'utilise que l'interface reste juste quand on change d'implémentation.

Pourquoi utiliser deque au lieu d'une liste pour une file en Python ?

Parce que pop(0) n'est pas en temps constant : pour retirer le premier élément d'une liste de kk éléments, il fait glisser les k−1k - 1 autres d'une case. Vider ainsi une file de nn éléments coûte n(n−1)2\frac{n(n-1)}{2} décalages, 499 500 pour mille camions : un coût quadratique. Une deque, créée par deque() après from collections import deque, ajoute par append et retire par popleft en temps constant, et la file se vide en O(n)O(n). Défiler s'écrit popleft() : avec pop(), la deque se comporte en pile, sans erreur. En France, deque n'est pas exigible et le sujet le documente ; au programme marocain, elle est nommée en deuxième année, au parcours des graphes.

Comment vérifier qu'une expression est bien parenthésée avec une pile ?

Avec une seule sorte de parenthèses, un compteur suffit : il augmente sur (, diminue sur ), ne doit jamais devenir négatif et doit finir à 0. Avec (), [] et {}, il faut une pile, car la dernière ouverte est la première fermée : "([)]" a des comptes justes et reste mal parenthésée. On empile chaque ouvrante ; sur une fermante, si la pile est vide, on renvoie False, sinon on dépile et l'on vérifie que l'ouvrante correspond. À la fin, la chaîne est bien parenthésée si et seulement si la pile est vide. Le coût est en O(n)O(n) pour nn caractères. En empilant les indices des ouvrantes, on retrouve les couples de parenthèses associées.

Comment évaluer une expression postfixée avec une pile ?

En notation postfixée, ou polonaise inverse, l'opérateur suit ses deux opérandes : (250−10)×3(250 - 10) \times 3 s'écrit 250 10 - 3 *. On lit les jetons de gauche à droite ; un nombre est empilé ; un opérateur dépile d'abord l'opérande de droite, puis celui de gauche, calcule et empile le résultat. À la fin, la pile contient une seule valeur, ici 720. L'ordre des opérandes compte pour - et / : 7 2 - vaut 5, et les prendre dans l'ordre où on les dépile donnerait −5-5. Une expression mal formée est arrêtée par une précondition, pile vide sous un opérateur ou plus d'une valeur à la fin. Le coût est en O(n)O(n) pour nn jetons.

Comment faire une file avec deux piles ?

On enfile en empilant sur une pile d'entrée. Pour défiler, on dépile une pile de sortie ; si elle est vide, on y verse d'abord toute la pile d'entrée, ce qui renverse l'ordre et place le plus ancien élément au sommet. Un défilement peut coûter cher, puisqu'il transfère toute la pile d'entrée, mais chaque élément n'est transféré qu'une fois. Sur une suite de mm opérations, il y a donc au plus mm transferts : le coût total est en O(m)O(m), et le coût moyen d'une opération est constant. Ce raisonnement sur toute la suite d'opérations s'appelle une analyse amortie ; le mot n'est pas au programme.

Comment y accéder

Ce chapitre fait partie de l'accès complet. Les trois premiers chapitres de chaque matière (deux par bloc en économie et droit, en management et gestion) sont offerts avec un compte d'essai gratuit. Créer un compte d'essai ou se connecter. Pour l'accès complet et les tarifs, vois les offres.

Toute ta prépa au même endroit

Pour chaque chapitre : le cours, l'essentiel, les méthodes, les pièges, les exercices corrigés, les problèmes de concours, et un assistant qui répond à tes questions. Programmes du Maroc et de France. Avec la plateforme vidéo YOUNESS SCHOOL offerte, dès 600 DH (60 $) par mois, sans engagement.

Prépas scientifiques : voir l'offrePrépas ECS et ECT : voir l'offreTu hésites encore ? Essaie gratuitement Prepa Help.

← Tris par sélection, à bulles, par insertion et par comptage