====== Implémentation procédurale des piles - variante ======
===== Choix de structure =====
Je reprend la même structure que celle adoptée dans [[.structures:pile_implementation|Implémentation pile]]. Là encore, à la création de la pile, on spécifie une taille N qui sera la taille maximale de la pile.
Pour stocker la pile, on créera un **tableau fixe** de N items et une variable indiquant le nombre d'items contenus dans la pile.
**Attention :** contrairement à la solution vue en classe, on ne mettra pas tout dans un même tableau de taille N + 1. On adoptera la structure suivante :
>>> CREER_PILE_VIDE(5)
{"data":[None, None, None, None, None], "n":0}
==== Exemple d'évolution ====
* ''P = CREER_PILE_VIDE(5)'' -> ''%%P = {"data":[None, None, None, None, None], "n":0}%%''
* ''EMPILER(P, 17)'' -> ''%%P = {"data":[17, None, None, None, None], "n":1}%%''
* ''EMPILER(P, 25)'' -> ''%%P = {"data":[17, 25, None, None, None], "n":2}%%''
* ''EMPILER(P, 8)'' -> ''%%P = {"data":[17, 25, 8, None, None], "n":3}%%''
* ''DEPILER(P)'' -> renvoie 8 et ''%%P = {"data":[17, 25, 8, None, None], "n":2}%%''
===== Fichier Python =====
"""
pile_variante.py
Module définissant l'interface des piles
"""
def CREER_PILE_VIDE(taille_max:int):
"""
taille_max: taille maximale de la pile
Renvoie une pile vide
exemples :
CREER_PILE_VIDE(5) -> {"data":[None, None, None, None, None], "n":0}
CREER_PILE_VIDE(3) -> {"data":[None, None, None], "n":0}
"""
return {"data":[None]*taille_max, "n":0}
def EST_VIDE(P):
"""
Renvoie True si la pile est vide, False sinon
"""
return P["n"] == 0
def EST_PLEINE(P):
"""
Renvoie True si la pile est pleine, False sinon
"""
return P["n"] = len(P["data"])
def EMPILER(P, e):
"""
Ajoute l'élément e sur le dessus de la pile
précondition: pile non pleine
"""
assert not EST_PLEINE(P)
n = P["n"]
P["data"][n] = e
P["n"] += 1
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)
P["n"] -= 1
n = P["n"]
return P["data"][n]
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
"""
n = P["n"]
data = P["data"][:n]
# conversion text
str_data = [str(item) for item in data]
# jonction
return ":".join(str_data)
# zone de test
if __name__ == '__main__':
# création de P = 4:9:17:12
P = CREER_PILE_VIDE(100)
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 !")