Mise en œuvre de la structure de pile
¦On programme cette structure en PYTHON en utilisant des listes.
def pile_vide():
return []
def empiler(P,x):
P.append(x)
def est_vide(P):
return len(P)==0
La fonction dépiler est un peu plus complexe. On utilise la fonction pop qui renvoie le der-
nier élément de la liste et le retire. On ajoute également un test permettant de déclencher
une erreur si la liste est vide :
def depiler(P):
assert not est_vide(P), "La pile est vide"
x = P.pop()
return x
La commande assert c,steste si la condition cest vraie. Si c’est le cas, alors le programme
continue normalement, sinon une erreur est déclenchée et la chaîne de caractères sest
affichée.
Remarque. Pourquoi utiliser une pile (et pas une liste) ?
• Si un algorithme utilise une pile, alors il peut être programmé dans tout langage qui
dispose de cette structure.
• La structure de pile est plus simple à mettre en œuvre que la structure de liste.
• Les primitives de manipulation des piles ont une meilleure complexité que celles de
manipulation des listes.
• Des structures de piles peuvent être présente à un niveau assez bas dans la concep-
tion d’un ordinateur.
Quand vaut-il mieux utiliser une liste plutôt qu’une pile ?
• Quand on a besoin d’accéder à n’importe quel élément et pas seulement au dernier.
• Quand on a besoin d’ajouter ou supprimer des éléments à des positions quelconques.
• Quand on a besoin de connaitre le nombre d’éléments présents dans la structure.
Exemple. On considère la suite (un) définie par
u0=2 et pour n∈N,un+1=2un−1. On veut
définir une fonction afficher(n) qui affiche
les valeurs de un,un−1,...,u1,u0dans cet ordre.
Le principe est le suivant :
• On crée une pile vide et on empile u0;
• L’élément uau sommet de la pile représente
un terme de la suite. On le dépile puis on le re-
met et on empile ensuite 2u−1 qui est le terme
suivant. On répète ceci nfois ;
• La pile contient alors u0,u1,...,un(dans cet
ordre). On dépile l’élément au sommet, on l’af-
fiche, puis on recommence tant que la pile n’est
pas vide.
def afficher(n):
P = pile_vide()
empiler(P,2)
for k in range(n):
u = depiler(P)
empiler(P,u)
empiler(P,2*u-1)
while not est_vide(P):
print(depiler(P))
afficher(8)
257 129 65 33 17 9 5 3 2