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() I1 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 Ii+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() I1 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 Ii+1 Fintantque Retourne (dépiler(valdrte)) Fin NeoXsysm & DiAboLiK DUT info 1er année ALGORITHME Pages 8/8