Outils pour utilisateurs

Outils du site


nsi:terminales:structures:pile_implementation_listechainee

Implémentation procédurale des piles - variante liste chaînée

Choix de structure

Je propose une structure complètement différente par rapport à celle de Implémentation pile. Cette fois on adopte une structure de liste chaînée.

L'intérêt d'une liste chaînée est qu'elle peut fluctuer en taille. Nous n'allons donc pas fixer une taille à la création. Cette variante de pile est libre d'augmenter sans limite – les limites sont celles de la machine bien sûr.

De ce faite, nous n'avons plus besoin de fonction PILE_PLEINE(P). Néanmoins, si on veut maintenir une interface compatible, rien ne nous empêche de prévoir une fonction PILE_PLEINE(P) qui renvoie toujours False (cette variante de pile ne peut pas être pleine).

Dans cette variante, les nouveaux éléments sont insérés en tête de liste.

Fichier Python

"""
pile_variante_liste_chainee.py
Module définissant l'interface des piles
"""

def CREER_PILE_VIDE():
    """
    Renvoie une pile vide
    """
    return {"head":None}

def EST_VIDE(P):
    """
    Renvoie True si la pile est vide, False sinon
    """
    return P["head"] == None
    

def EST_PLEINE(P):
    """
    Renvoie True si la pile est pleine, False sinon
    """
    return False

def EMPILER(P, e):
    """
    Ajoute l'élément e sur le dessus de la pile
    précondition: pile non pleine
    """
    new_maillon = {"value":e, "next":P["head"]}
    P["head"] = new_maillon

def DEPILER(P):
    """
    Enlève l'élément sur le dessus de la pile et le renvoie
    précondition: pile non vide
    """
    assert not EST_VIDE(P)
    first_maillon = P["head"]
    P["head"] = first_maillon["next"]
    first_maillon["next"] = None
    return first_maillon["value"]
    
def TEXTE(P):
    """
    Renvoie une représentation texte du contenu de la pile
    On utilise la notation, par ex, 4:9:17:12, 12 étant ici le sommet de la pile
    """
    outStr = ":"
    m = P["head"]
    while m != None:
        value = m["value"]
        outStr += f"{value}:"
        m = m["next"]
    return outStr[:-1]
    
# zone de test
if __name__ == '__main__':    
    # création de P = 4:9:17:12
    P = CREER_PILE_VIDE() # on n'a pas besoin d'indiquer une taille
    EMPILER(P,4)
    EMPILER(P,9)
    EMPILER(P,17)
    EMPILER(P,12)
    
    # tests
    assert EST_VIDE(P) == False
    assert EST_PLEINE(P) == False
    assert TEXTE(P) == "4:9:17:12"
    assert DEPILER(P) == 12
    assert TEXTE(P) == "4:9:17"
    assert DEPILER(P) == 17
    assert TEXTE(P) == "4:9"
    DEPILER(P)
    DEPILER(P)
    assert EST_VIDE(P) == True
    
    # si on arrive là, c'est que tous les test ont été passés avec succès
    print("Succès !")
nsi/terminales/structures/pile_implementation_listechainee.txt · Dernière modification : de 114.119.146.215