Вы находитесь на странице: 1из 4

Informatique

Cours 3

Piles

Dans un programme o les donnes traites arrivent au fur et mesure, il peut tre commode
denvisager des listes accs particulier : celles o lajout/le retrait dun lment se fait uniquement aux
extrmits.

Figure 1 :

Pile de travail

File d'attente

1 Pile et file
"LIFO" (Last In First Out) : on ajoute/retire une seule extrmit.
La liste modlise alors une pile : on ajoute au sommet push et on retire au sommet pull.
Exemples :
- mmorisation des pages web visites dans un navigateur (prcdent = pull, suivant = push),
- fonction dfinie par rcurrence : pile des appels rcurrents.
"FIFO" (First In First Out) : on ajoute une extrmit de la liste et on retire lautre. La liste modlise
alors une file.
Exemple : gestion des tches dune imprimante.
Dans ce cours dinformatique, on se limitera lutilisation des piles.

2 Pile
2.1 Fonctions lmentaires d'un pile
Avant de voir comment implmenter concrtement une pile, il peut tre intressant de dcrire lensemble
des oprations que cette structure de donnes doit permettre :
-

creer_pile(c) : fonction qui renvoie une pile de capacit c (entier positif) initialement vide.
depiler(p) : dpile et renvoie le sommet de la pile p (si non vide).
empiler(p,v) : empile la valeur v sur la pile p (si non pleine).

On veut galement disposer de fonctions qui donnent des caractristiques de la pile sans la modifier :
-

taille(p) : renvoie le nb dlments dans la pile p.


est_vide(p) : indique si la pile p est vide.
sommet(p) : renvoie la valeur au sommet de la pile p.

Exemple d'utilisation :

B
A

C
B
A

B
A

D
A

Figure 2 : Evolution de la pile en fonction des instructions


(prsentation verticale : pile)

Lyce Jules Ferry Cannes

Page 1 sur 4

TSI2

Informatique

Cours 3

Piles

2.2 Comparaison entre une pile et une liste


Pile : approprie quand on veut stocker des lments dont le nombre est variable (le cardinal maximal est inconnu
lavance), on peut (on doit) se contenter daccder au dernier lment stock.

Tableau "classique" sous forme d'une liste : appropri quand on veut pouvoir accder un lment
quelconque tout moment (mais dans ce cas, il est prfrable de connatre lavance un majorant du nombre
dlments stocker).

3 Pile capacit finie


3.1 Structure
On utilise un tableau de taille N, avec N assez grand (au moins gal au nombre max dlments que lon
veut stocker dans la pile).
Les lments sont rangs dans lordre o ils sont empils.
Pour pouvoir empiler / dpiler, il faut connatre la position du sommet de la pile dans le tableau.
Solution
On stocke :
- le nombre dlments n (entier positif) de la pile dans la case 0 du tableau
T[0]=n=indice du sommet de la pile).
- les n lments de la pile dans les cases 1 n.
0 1 n n + 1 .. N
n lments de la pile place disponible
Exemple d'utilisation :
la pile des appels des fonctions rcursives est limite par dfaut 1000 (Spyder).
Exemple de fonctionnement :
p1 = creer_pile(3)
empiler(p1,'A')
empiler(p1,'B')
empiler(p1,'C')
depiler(p1)
empiler(p1,'D')
empiler(p1,'E')

0
1
2
3
2
3
3

A
A
A
A
A
A

B
B
B
B
B

C
C
D
D

'C' toujours stock mais cras au prochain empilement.


pile pleine : l'lment E est n'est pas stock.

3.2 Implmentation
Fonctions agissant sur la pile
def creer_pile(c):
p=(c+1)*[None]
p[0]=0
return p

def depiler(p):
n=p[0]
if n >0 :
p[0]=n-1
return p[n]

Fonction d'information sur la pile


def taille(p):
def est_vide(p):
return p[0]
return p[0]==0

Lyce Jules Ferry Cannes

Page 2 sur 4

def empiler(p,v):
n=p[0]
if n < len(p)-1:
n=n+1
p[0]=n
p[n]=v
return p
def sommet (p):
if p[0]>0 :
return p[p[0]]

TSI2

Informatique

Cours 3

Piles

4 Pile capacit non borne


Une pile a capacit non borne la taille du nombre d'lments stocks dans la pile.
Les mthodes associes aux listes permettent d'obtenir des piles capacit non borne :
- empiler grce L.append(v) permet d'ajouter v droite de la liste L,
- dpiler grce L.pop() rcupre le dernier lment de la liste L et le retire de L.
Les avantages sont :
- de ne pas tre limit dans le nombre de valeurs stocker,
- de ne pas avoir besoin d'enregistrer le nombre d'lments stocks dans la pile (la taille de la
pile est la taille de la liste),
L'inconvnient est que la pile peut prendre un volume important (pas d'information sur le fait que les
appels des fonctions rcursives ne se terminent pas).
Exemple de fonctionnement :
p1 = creer_pile()
empiler(p1,'A')
empiler(p1,'B')
empiler(p1,'C')
depiler(p)

La liste p1 est vide : pas d'lment stock.


A
A B
A B C
A B

Fonctions agissant sur la pile


def creer_pile():

return p=[ ]

def depiler(p):

if len(p)>0 :
return p.pop()

Fonction d'information sur la pile


def taille(p):
def est_vide(p):

return len(p)

return len(p)==0

def empiler(p,v):

p.append(v)
return p

def sommet(p):

if len(p)>0 :
return p[-1]

Remarque :
La liste locale p d'une fonction f(p) est un alias de la liste passe en entre lors de l'appel de la fonction
par l'instruction f(p1), par exemple.
Il n'est donc pas indispensable de renvoyer, en sortie de la fonction, la liste modifie.
Exemple : def empiler(p,v):
p.append(v)
p1=[0,1,2]
empiler(p1,3)
>>> p1
[0,1,2,3]

Lyce Jules Ferry Cannes

# la modification de p a impact directement la variable globale p1


# car p est l'alias de p1 dans la fonction empiler.

Page 3 sur 4

TSI2

Informatique

Cours 3

Piles

Pour modifier une liste passe en entre d'une fonction, sans quelle modifie directement la liste globale,
il faut passer par une variable locale.
Exemple : def ajouter(L,v):
L1=L[0:]
# L1 : locale, est affecte par les indices pour ne pas crer un alias
L1.append(v)
return L1
p1=[0,1,2]
L2 = ajouter(p1,3)
>>> p1
[0,1,2]
>>> L2
[0,1,2,3]

Pour la pile, il est plus simple de conserver la liste p comme un alias de p1 car les modifications faites
dans les fonctions depiler et empiler doivent tre rpercutes sur la liste passe en entre.

Ressources :
Damien Broizat
Patrick Beynet UPSTILyce Jules Ferry Cannes

Page 4 sur 4

TSI2

Вам также может понравиться