Adloun

Problème — Implémentation complète d'une pile par une classe

Application directe du cours · niveau 1 (application) · NSI (terminale), chapitre 1 — Structures de données linéaires

Énoncé

Problème — Implémentation complète d'une pile par une classe.

Implémenter une classe Pile respectant l'interface du type abstrait pile (est_vide, empiler, depiler, sommet, taille), gérant proprement les erreurs, puis l'utiliser pour évaluer si une expression ne contenant que des parenthèses, crochets et accolades est correctement fermée.

Corrigé


class Pile:
    """Type abstrait pile (LIFO) implemente par une liste."""

    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("depiler sur une pile vide")
        return self._contenu.pop()

    def sommet(self):
        if self.est_vide():
            raise IndexError("sommet sur une pile vide")
        return self._contenu[-1]

    def taille(self):
        return len(self._contenu)


def bien_ferme(expr):
    """Verifie l'appariement de (), [] et {}."""
    paires = {")": "(", "]": "[", "}": "{"}
    pile = Pile()
    for c in expr:
        if c in "([{":
            pile.empiler(c)             # ouvrante : on empile
        elif c in ")]}":
            if pile.est_vide():
                return False            # fermante sans ouvrante
            if pile.depiler() != paires[c]:
                return False            # mauvais appariement
    return pile.est_vide()             # tout doit etre referme

# Tests
print(bien_ferme("([]{})"))    # True
print(bien_ferme("([)]"))      # False (croisement)
print(bien_ferme("(()"))       # False (ouvrante en trop)

La pile mémorise les symboles ouvrants en attente. À chaque symbole fermant, on vérifie qu'il correspond au dernier ouvrant rencontré : c'est exactement le comportement LIFO. Toutes les opérations de pile étant en et chaque caractère étant traité une fois, le coût total est .

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.