Adloun

Problème — File implémentée à deux piles

Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 1 — Structures de données linéaires

Énoncé

Problème — File implémentée à deux piles.

Un exercice classique consiste à réaliser une file (FIFO) en n'utilisant que deux piles (LIFO). Implémenter une classe FileDeuxPiles avec les méthodes enfiler et defiler, et expliquer le coût des opérations.

Corrigé

L'idée : une pile entree reçoit les éléments enfilés ; une pile sortie sert à les défiler. Quand sortie est vide, on y transvase tout le contenu de entree, ce qui inverse l'ordre et place le plus ancien au sommet.


class FileDeuxPiles:
    def __init__(self):
        self._entree = []      # pile ou l'on empile les arrivees
        self._sortie = []      # pile d'ou l'on defile

    def est_vide(self):
        return len(self._entree) == 0 and len(self._sortie) == 0

    def enfiler(self, x):
        self._entree.append(x)         # toujours dans la pile d'entree

    def defiler(self):
        if self.est_vide():
            raise IndexError("defiler sur une file vide")
        if len(self._sortie) == 0:
            # transvasement : inverse l'ordre des elements
            while len(self._entree) > 0:
                self._sortie.append(self._entree.pop())
        return self._sortie.pop()      # le plus ancien est au sommet

# Test : FIFO attendu
f = FileDeuxPiles()
f.enfiler(1)
f.enfiler(2)
f.enfiler(3)
print(f.defiler())   # 1
print(f.defiler())   # 2
f.enfiler(4)
print(f.defiler())   # 3
print(f.defiler())   # 4

Analyse du coût : enfiler est toujours en . Une opération defiler peut déclencher un transvasement coûteux en , mais chaque élément n'est transvasé qu'une seule fois durant toute sa vie dans la file. Réparti sur l'ensemble des opérations, le coût amorti de defiler est donc .

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.