Pile et Notation Polonaise Inversée

Transcription

Pile et Notation Polonaise Inversée
Pile et Notation Polonaise Inversée
Notion de pile
Une pile permet de mémoriser des objets. Les opérations qu'elle permet sont :
- ajouter un objet à la pile (empiler)
- retirer le dernier objet de la pile (dépiler)
Tout se passe comme avec une pile d'assiettes : le dernier objet empilé est le premier qui sera dépilé.
En Pascal, on définit le type des objets qui seront contenus dans la pile, puis on peut utiliser un enregistrement
qui représentera une pile.
Pour une pile contenant des nombres de type Real on aura :
const
maxpile = 20 { nombre maximal d'objets empilables }
type
TObjetDeLaPile=Real;
TPile=record
Tab
: array[1..maxpile] of TObjetDeLaPile;
{ tableau dans lequel sont rangés les objets }
haut
: Integer; { rang du dernier objet empilé }
erreur : Integer; { indicateur d'erreur :
0 si tout va bien;
1 pour dépassement de capacité;
2 pour dépilage impossible }
end;
Ecrire les procédures et fonctions suivantes :
procedure InitPile(var P:TPile);
{ initialisation des champs de l'enregistrement }
function EstVide(var P:TPile):Boolean;
{ indique si la pile est vide }
procedure Empile(x:TObjetDeLaPile; var P:TPile);
{ empiler x }
procedure Depile(var x:TObjetDeLaPile; var P:TPile);
{ dépiler dans x }
Expressions en notation polonaise inversée
Nous allons calculer des expressions en notation polonaise inversée (opérateurs postfixes) construites avec
des nombres et les opérateurs +, -, * et / . Les espaces joueront le rôle de séparateurs.
1) Lecture des parties d'une expression
Ecrire la procédure Separe(var Exp:String; var Deb:String) qui lit le premier item de l'expression
contenue dans Exp, le place dans Deb et ne laisse que la fin de l'expression dans Exp.
Ecrire les fonctions EstOp(S:String):Boolean et EstNombre(S:String):Boolean qui indiquent si la
chaîne contenue dans S est un opérateur ou un nombre.
2) Test de validité
Ecrire la fonction EstValide(S:String):Boolean indiquant si l'expression contenue dans la chaîne de
caractères S est valide en NPI. (utiliser la notion de poids d'un item: 1 pour les nombres et -1 pour les
opérateurs).
3) Interprétation d'une formule valide
On peut interpréter une formule en NPI en utilisant une pile de la façon suivante :
- les nombres sont simplement empilés
- lorsqu'on rencontre un opérateur b, on dépile x et y et on empile (ybx).
Quel rapport y a-t-il entre ces opérations, la pile et la notion de poids d'un caractère ?
Ecrire la fonction Calcule(S:String): real qui effectue ce travail et affiche le résultat obtenu.