Une pile est utilisée pour sauvegarder temporairement des

publicité
Les piles
Une pile est utilisée pour sauvegarder temporairement des informations.
I. Définition et primitives d’accès
A. Définition
Une pile est une liste telle qu’on passe d’un élément au suivant par adjonction ou suppression
d’un élément en tête.
Dans une pile, on distingue une base et un sommet. Toutes les mises à jour ne se font qu’à
partir du sommet. Théoriquement une pile est de taille infinie, en pratique elle est toujours
formée d’un nombre fini d’éléments. Les adjonctions s’arrêtent lorsque la taille maximale
(maximum) de la pile est atteinte, on parle de débordement de pile.
2
3
5
B. Primitives
1. Empiler
9
2
3
5
2
3
5
9
2. Dépiler
2
3
5
3
5
2
3. Sommet pile
Retourne la valeur du sommet.
4. Pile vide
5. Pile pleine
NeoXsysm & DiAboLiK
DUT info 1er année
ALGORITHME
Pages 1/8
6. Initpilevide
Une pile peut être représentée physiquement par un tableau (de manière
contigu), une liste chaînée, ou enfin un fichier.
II. Représentation contiguë d’une pile



Pile [1..n]
Taille maxi dimpile (n)
Sommet (indice du dernier stocké)
A. Empiler
Procédure empiler(valeur)
Val TIND valeur
Début
Si pilepleine
Alors
Afficher (« Erreur : la pile est pleine »)
Sinon
Sommet sommet +1
Pile[sommet] valeur
Finsi
Fin
B. Dépiler
Procédure dépiler(valeur)
Ref TIND valeur
Début
Si pilevide
Alors
Afficher(« Erreur : Pile vide »)
Sinon
Valeur  pile[sommet]
Sommet  sommet -1
Finsi
Fin
C. Sommet pile
Fonction TIND sommetpile
Début
Retourner(pile[sommet])
Fin
NeoXsysm & DiAboLiK
DUT info 1er année
ALGORITHME
Pages 2/8
D. Pile vide
Fonction logique pilevide()
Début
Retourne(sommet = 0)
Fin
E. Pile pleine
Fonction logique pilepleine()
Début
Retourne(sommet = dimpile)
Fin
F. Initialisation de la pile
Procédure initpile()
Début
Sommet  0
Fin
III. Représentation chaînée d’un pile
|/
A. Procédure empiler
Procédure empiler(elem)
Val TIND elem
Début
Insertete(pile, elem)
Fin
NeoXsysm & DiAboLiK
DUT info 1er année
ALGORITHME
Pages 3/8
B. Procédure dépiler
Procédure dépiler(elem)
Ref TIND elem
Début
Si pilevide
Alors
Afficher(« Erreur : Pile vide »)
Sinon
P pile
Elem (*pile).info
Pile (*pile).suivant
Supptete(pile)
Laisser(p)
Finsi
Fin
{
C. Procédure pilevide
Fonction logique pilevide()
Début
Retourne(pile = NULL)
Fin
D. Initialisation de la pile
Procédure initpilevide()
Début
Pile NULL
Fin
E. Sommet pile
Fonction TIND sommetpile()
Début
Retourne((*pile).info)
Fin
IV. Traitement des expressions arithmétiques à l’aide d’une pile
A. Définition
1. Expression écrite sous forme entièrement parenthèsée.
(a + b) x c
 ((a + b) x c)
((( a / b ) = ) ^ (e < f))
NeoXsysm & DiAboLiK
DUT info 1er année
ALGORITHME
Pages 4/8
2. Expression sous forme préfixée
(a – b) + c
 +-abc
((┐(a < b)) ^ c)
 ^┐<abc
3. Expression écrite sous forme postfixée
((a – b) + c)
 ab-c+
4. Expression écrite sous forme in-fixé
C’est la manière normal d’écrire les opérations.
B. Evaluation d’une expression
1. Postfixée
Soit l’expression :
((a x b) / (c + d))
 abxcd+/
a = 20
b=4
c=9
d=7
a|b|x|c|d|+|/|
#
20
abxcd+/#
7
9
80
4
20
abxcd+/#
16
80
NeoXsysm & DiAboLiK
DUT info 1er année
80
abxcd+/#
5
ALGORITHME
9
80
abxcd+/#
fin
Pages 5/8
abxcd+/#
abxcd+/#
a) Analyse de l’algorithme
abxcd+/#
abxcd+/#
On va empiler les données de expost (tableau de chaîne de caractères) de 1 à n.
Si expost[i] = « # » on est à la fin
Si expost[i] <> « # » alors :
 Soit expost[i] est une variable, il faut empiler sa variable
 Soit expost[i] est un opérateur, on dépile…., puis on empile le
résultat de l’opérateur.
b) Algorithme
Fonctions utilisées pour faciliter l’algorithme :
 Variable(x)  vrai si c’est une variable
 Unaire(x)  vrai si on a faire à un opérateur unaire
 Valeur(x)  délivre la valeur associée à la variable x
 Opère1(x,y)  retourne le résultat de l’opération unaire (x sur y)
 Opère2(x,y,z)  retourne le résultat de l’opération binaire (y sur x
et z)
Fonction TIND evalpost(expost[] ,n)
Val car expost[1..n]
Val entier n
Var locales
Entier i
TIND valdrte, valgche
Début
Initpilevide()
I1
Tantque expost[i] <> « # »
Faire
Si variable(expost[i])
Alors
Empiler(valeur(expost[i]))
Sinon
Si unaire(expost[i])
Alors
Depiler(valdrte)
Empiler(opère1(expost[i], valdrte))
Sinon
Dépiler(valdrte)
Dépiler(valgche)
Empiler(opère2(valgche, expost[i], valdrte))
Finsi
Finsi
Ii+1
Fintantque
Retourne (dépiler(valdrte))
NeoXsysm & DiAboLiK
DUT info 1er année
ALGORITHME
Pages 6/8
Fin
2. Evaluation d’une expression complètement parenthèsée

Principe :
Sauvegarder dans la pile des expressions complètes sans délimiteurs.

Remarque :
Il faut que la pile puisse contenir soit des valeurs numériques (ou logiques),
soit des opérateurs.
Exemple : (a x (b + c))
Etat de la pile : 1
+
3
x
2
A=2
B=3
C=1
4
x
2
( a x ( b + c ) )#
1 2 3 4 5 6 7 8 9
Algorithme :
Fonction TIND evalcp(excp[], n)
Val car excp[1..n]
Val entier n
Var locales
Entier i
Car oper
TIND valdrte, valgche
Début
Initpilevide()
I1
Tantque excp[i] <> « # »
Faire
Si variable(excp[i])
Alors
Empiler(valeur(excp[i]))
Sinon
Si operateur(excp[i])
Alors
Empiler(excp[i])
Sinon
Si excp[i] = « ) »
Alors
Dépiler(valdrte)
Dépiler(oper)
Si unaire(oper)
Alors
Empiler(opère1(oper, valdrte))
NeoXsysm & DiAboLiK
ALGORITHME
Pages 7/8
DUT info 1er année
8
Sinon
Dépiler(valgche)
Empiler(opère2(valgche, oper, valdrte))
Finsi
Finsi
Finsi
Finsi
Ii+1
Fintantque
Retourne (dépiler(valdrte))
Fin
NeoXsysm & DiAboLiK
DUT info 1er année
ALGORITHME
Pages 8/8
Téléchargement