Intuitivement, une pile correspond à une pile de livres sur une table.
La première opératoin consiste à poser un livre sur la table vide.
L’opération suivante place un second livre sur le livre déjà posé sur la
table. Chaque opération de rangement augmente la taille de la pile.
Prendre un livre sans provoquer l’effondrement de la pile n’est possible
qu’au sommet de la pile.
Traitement des expressions
En mode infixé, écrire une expression consiste à :
écrire un opérateur entre 2 opérandes,
écrire un opérateur unaire suivit de son opérande,
modifier l’ordre des priorités à l’aide de parenthèses.
Le traitement informatique d’une expression prefixée est malaisé. Il est
préférable d’effectuer le traitement de l’expression équivalente en mode
postfixé ou infixé. Par exemple, l’expression devient en notation postfixée.
Règles de transformation
Les variables successivement rencontrées dans l’expression infixée sont
rangées directement dans l’expression préfixée.
Les opérateurs sont emplilés en tenant compte de leur priorité :
priorité de l’opérateur ds l’expression priorité de l’opérateur
au sommet de la pile empiler l’opérateur,
priorité de l’opérateur ds l’expression priorité de l’opérateur
au sommet de la pile désempiler et ranger l’opérateur
désemplilé dans l’expression postfixée.
Empiler systématiquement une parenthèse ouvrante car elle délimite une
sous-expression,
la parenthèse fermante fait sortir tous les éléments de la pile jusqu’à
la rencontre d’une parenthèse ouvrante.
Écriture au moyen d’un type de données abstrait
Supposons que nous disposions d’un type de données abstrait de
{\it pile},
on peut empiler les termes, les facteurs et les opérateurs afin d’obtenir la
traduction de l’expression infixée en expression préfixée :
struct item
{
int type ;
union {
char op ; int val ;
} contenu ;
} ;
typedef struct item ITEM ;
typedef struct item * Item ;
...
pile (Item) ; Itempile p ;
int ValLex ; int Symbole ;
...
Emettre (int Lex, int Val)
{
ITEM x ; Item y ;
switch (Lex)
{
case '+' : case '-' : case '*' : case '/' :
x.type = OP ;
x.contenu = Lex ;
y = Item_copier(&x) ;
Itempile_empiler (p, y) ;
break ;
case NB : /* C'est un nombre */
x.type = NB ;
x.contenu = Val ;
y = Item_copier(&x) ;
Itempile_empiler (p, y) ;
break ;
default :
}
}
main ()
{
p = Itempile_creer(Item_copier,
Item_detruire, Item_editer) ;
Analyse() ;
}