====== Implémentation procédurale des piles ====== ===== Choix de structure ===== Je propose d'opter pour une pile de **taille maximale fixée** d'avance, ce qui se pratique beaucoup. On peut donc utiliser un tableau -- type ''list'' de Python -- ce qui sera plus simple que pour les [[nsi:terminales:structures:liste_implementation|listes]]. À titre de comparaison, je vous propose deux autres implémentations. Une [[..:pile_implementation_variante|variante]] très semblables et une autre basée sur une [[pile_implementation_listechainee|liste chaînée]] ==== Utilisation d'un tableau ==== On se fixera une taille maximale N, ce qui signifie que la pile P a toujours à sa disposition N cases mémoires. Pourtant, la pile n'utilise pas toujours ces N cases. À un moment donné, la pile ne contient que n éléments. Il faut écrire quelque part le nombre de cases en cours d'utilisation, c'est à dire le nombre d'éléments de la pile. Pour cela on décide de créer un tableau de N + 1 cases, * N cases disponibles pour les items de la pile -- pas forcément toutes utilisées, * la N + 1 ème case -- ''P[N]'' -- pour contenir le nombre de cases en cours d'utilisation ==== Exemple d'évolution ==== * ''P = CREER_PILE_VIDE(5)'' -> ''P = [None, None, None, None, None, 0]'' * ''EMPILER(P, 17)'' -> ''P = [17, None, None, None, None, 1]'' * ''EMPILER(P, 25)'' -> ''P = [17, 25, None, None, None, 2]'' * ''EMPILER(P, 8)'' -> ''P = [17, 25, 8, None, None, 3]'' * ''DEPILER(P)'' -> renvoie 8 et ''P = [17, 25, 8, None, None, 2]'' {{ .:piles-2.png?direct&600 |}} Dans le cas du dépilement, il n'est pas nécessaire d'effacer la valeur dépilée. En effet, puisque l'on a modifié ''P[5]'' de 3 à 2, maintenant les seuls éléments considérés comme appartenant à la pile sont les 2 premiers, 17 et 25. Bien que 8 soit toujours écrit en 3e position, il est ignoré. Si l'idée vous crée trop de difficultés, vous pouvez effacer le 8 et le remplacer par ''None'' lors du dépilement... ===== Fichier Python ===== """ piles.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) -> [None, None, None, None, None, 0] CREER_PILE_VIDE(3) -> [None, None, None, 0] """ def EST_VIDE(P): """ Renvoie True si la pile est vide, False sinon """ def EST_PLEINE(P): """ Renvoie True si la pile est pleine, False sinon """ def EMPILER(P, e): """ Ajoute l'élément e sur le dessus de la pile précondition: pile non pleine """ def DEPILER(P): """ Enlève l'élément sur le dessus de la pile et le renvoie précondition: pile non vide """ 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 """ # 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 !") ===== Exemples en d'autres langages ===== Vous pouvez voir un exemple d'implémentation [[nsi:langages:go:solutions:pile|en Go]] ou -- beaucoup plus difficile -- [[nsi:langages:c:solutions:pile|en C]].