Ceci est une ancienne révision du document !
Gestion de piles lifo et fifo
Gestion de piles lifo (dernier entré, premier sorti)
Une pile lifo est assimilable à un tas:
Voilà le code proposé:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# pile lifo (last in first out): on dépile le dernier élément empilé
class Pile(object):
def __init__(self):
self._pile=[]
def empile(self,element):
self._pile.append(element)
def depile(self):
return self._pile.pop()
def element(self,i=-1):
return self._pile[i]
def pile(self,imin=0,imax=None):
if imax=None:
imax=len(self._pile)
return list(self._pile[imin:imax])
def estvide(self):
return len(self._pile)==0
def taille(self):
return len(self._pile)
# exemple d'utilisation:
x=Pile()
print x.pile() # affiche []
print x.estvide() # affiche True
x.empile('A')
x.empile(5)
x.empile(['toto','titi','tata'])
print x.pile() # affiche ['A', 5, ['toto', 'titi', 'tata']]
z=x.depile()
print z # affiche ['toto', 'titi', 'tata']
print x.pile() # affiche ['A', 5]
print x.taille() # affiche 2
print x.element() # affiche 5
Commentaires sur ce code:
A l'initialisation, par exemple x=Pile() :
x.empile(element):
on peut empiler n'importe quel objet Python: nombre, chaîne, liste, tuple, dictionnaire, …
il n'y a pas de limite supérieure à la quantité d'éléments qu'on peut empiler, à part celle de la mémoire de l'ordinateur.
x.depile() ou z=x.depile() :
on peut dépiler sans récupérer l'élément (x.depile()) ou en le récupérant (z = x.depile())
une tentative de dépiler une pile vide produit une exception “IndexError” qu'il faudra gérer dans le code utilisateur
x.element() ou x.element(i):
sans argument, renvoie le dernier élément de la pile sans le dépiler
avec un argument, renvoie l'élément d'index i. Pour être valide, cet indice doit être: -x.taille() <= i < +x.taille()
si l'index i n'est pas valide, déclenche une exception “IndexError” qu'il faudra gérer dans le code utilisateur
x.pile() ou x.pile(imin,imax):
sans argument, renvoie la pile complète sous forme d'une liste. Vous noterez la présente de list() dans le code: sans cela, une modification de la liste renvoyée modifierait la pile.
avec argument(s), vous pouvez préciser l'index de départ (0 par défaut) et l'index de fin+1 (=x.taille() par défaut):
attention: les index d'une liste de longueur lg vont de 0 à lg-1
x.pile(2) ou x.pile(imin=2) renvoie comme liste la pile à partir de l'index 2 (=3ème élément) jusqu'à la fin
x.pile(2,5) ou x.pile(2,imax=5) ou x.pile(imin=2,imax=5): renvoie comme liste la pile entre les index 2 et 4 compris (5 exclu)
x.pile(imax=5): renvoie comme liste la pile entre les index 0 et 4 compris (5 exclu)
NB: le syntaxe x.pile(imin=2,5) est interdite (par d'argument simple après un argument nommé)
si l'un des index fournis n'est pas valide (hors de -x.taille() <= i < +x.taille()), génère une exception “IndexError” qu'il faudra gérer dans le code utilisateur
x.estvide():
x.taille():
Gestion de piles fifo (premier entré, premier sorti)
Une pile lifo est assimilable à file d'attente:
Voilà le code proposé: