Structure de pile et opérations sur les piles
Définition
Une pile est une structure de données (abstraite) qui autorise les trois opérations fondamentales suivantes :
- l'empilage d'un objet, c'est à dire son inseron dans la structure
- le dépilage du dernier objet qui a été empilé dans la structure
- le test qui détermine si la pile est vide ou non.
Commentaires
Concrètement, une pile est donc une structure de données que l’on peut comparer à une pile de cartes ou
d’assiettes.
Pour accéder à l’élément situé à la base de la pile, il faut commencer par enlever tous ceux qui sont situés au
dessus.
Cette structure est parfois qualifiée de LIFO (Last In First Out).
Exemple d’utilisation :
Stockage de l’historique des actions effectuées dans un logiciel afin de gérer une fonction d’annulation de
ces actions dans l’ordre inverse.
Implémentation en python
La première idée qui vient à l’esprit est d’utiliser une liste python (variable de type list) en guise de pile.
Notons qu’une liste python a une taille redimensionnable en fonction des besoins, ce qui convient pour
représenter une pile dont la taille maximale est a priori indéterminée.
Mais en toute rigueur une variable de type list est plus qu’une simple pile (on peut par exemple accéder
directement à n’importe quel élément d’une liste, ce qui est interdit pour une pile), et il faudrait donc inventer un
nouveau type (le type pile). C’est possible en python, car c’est un langage de programmation orienté objet (POO) :
il est possible de créer une « classe » Pile qui possède les propriétés de la structure de pile.
Exemple de réalisation d’un module contenant une classe « Pile »
# Définition d’une classe Pile, d’attributs et de méthodes #########
class Pile(object):
# Déclaration de classe
"""Classe Pile, structure de données que l'on peut empiler, dépiler
et à laquelle on ne peut accéder que par le sommet.
Il est interdit de modifier les attributs sommet et liste à l'extérieur de la classe"""
Les fonctions disponibles sont :
pile_vide() est_vide(p) litsommet(p) taille(p)"""
def __init__ (self,sommet,liste):
# Définition de la méthode constructeur, sert à initialiser l’objet et à définir les attributs ;
self.S=sommet
# self représente l’objet, S est l'attribut sommet
self.L=liste
# L est l'attribut de la liste des éléments de la pile
def empile(self,v):
# Définition d'une méthode qui empile la valeur v sur la pile
"""Ajoute la valeur v au sommet de la pile"""
self.L.append(v)
self.S=v
def depile(self):
# Définition d'une méthode qui depile la pile et renvoie la valeur dépilée
"""Supprime le sommet de la pile p
et retourne sa valeur (pour une pile non vide)"""
if len(self.L)>0:
x=self.S
# x contient l'ancien sommet à retourner en fin de procédure
self.L.pop()
# On supprime l'ancien sommet
if len(self.L)>0:
# On redéfinit le nouveau sommet s'il existe, sinon il vaut None
self.S=self.L[-1]
else:
self.S=None
return x
# permet d'affecter l'élément dépilé dans le programme appelant
else:
print("Pile vide, rien à dépiler")
# signale si la pile est vide