Corrigé 27. Enoncé
1. Implémentation d'une liste linéaire chaînée de piles
Liste en dynamique, Pile en statique
TYPE Typelist = POINTEUR( Tmaillon);
TYPE Tmaillon = STRUCTURE
Val : Typepile
Suiv : POINTEUR(Tmaillon)
FIN
TYPE Typepile = STRUCTURE
Tab : TABLEAU[1..N] DE
Typeqq
Som : ENTIER
FIN
Liste en dynamique, Pile en dynamique
TYPE Typelist = POINTEUR( Tmaillon);
TYPE Tmaillon = STRUCTURE
Val : Typepile
Suiv : POINTEUR(Tmaillon)
FIN
TYPE Typepile = POINTEUR( Tmaillon1)
TYPE Tmaillon1 = STRUCTURE
Val : Typeqq
Suiv : POINTEUR(Tmaillon1)
FIN
Liste en statique, Pile en dynamique
{ 1 est l'adresse du premier élément de la liste dans le tableau }
TYPE Typeliste = TABLEAU[1..M] DE Typeelementtableau
TYPE Typeelementtableau = STRUCTURE
Val : Typepile
Suiv : ENTIER
Vide : BOOLEEN
FIN
TYPE Typepile = POINTEUR( Tmaillon1)
TYPE Tmaillon1 = STRUCTURE
Val : Typeqq
Suiv : POINTEUR(Tmaillon1)
FIN
Liste en statique, Pile en statique
TYPE Typeliste = TABLEAU[1..M] DE Typeelementtableau
TYPE Typeelementtableau = STRUCTURE
Val : Typepile
Suiv : ENTIER
Vide : BOOLEEN
FIN
TYPE Typepile = STRUCTURE
Tab : TABLEAU[1..N] DE
Typeqq
Som : ENTIER
FIN
2. Traduction automatique d'une procédure récursive
Traduction automatique
La Zdd contient les champs X, Y et Adr. Adr étant l'adresse de retour.
Lire(N, M)
Creerpile(P)
Empiler(P, Zdd)
{Préparation Premier Appel}
Zdd.X := N
Zdd.Y := M
Zdd.Adr := 1
10 SI Zdd.Y = 0
R := 0
{Retour}
I := Zdd.Adr
Depiler(P, Zdd)
Allera I
FSI
{Appel}
Empiler(P, Zdd)
Zdd.X := Zdd.X * 2
Zdd.Y := Zdd.Y DIV 2
Zdd.Adr := 2
Allera 10
2 SI NON Pair(Zdd.Y) : R := R + Zdd.X FSI
{Retour}
I := Zdd.Adr
Depiler(P, Zdd)
Allera I
1 Ecrire( R)
Trace
Les différents états de la pile sont : (x, x, x) --> (5, 5, 1) --> (10, 2, 2)
--> (20, 1, 2)
Les différentes valeurs de la zone de données : (5, 5, 1); (10, 2, 2); (20, 1, 2); (40,
0, 2); (20,1, 2); (10,2, 2); (5, 5, 1).
Algorithme amélioré
Il suffit d'éliminer l'adresse de retour de la zone de données comme elle est unique. On
remplace alors l'opération Dépiler(Pile, Zdd) par Dépiler(Pile, Zdd, Possible). Ainsi,
quand un dépilement n'est plus possible, il y a retour vers l'appelant.
Lire(N, M)
Creerpile(P)
{Préparation du premier appel}
Zdd.X := N
Zdd.Y := M
10 SI Zdd.Y = 0
R := 0
{Retour}
Dépiler(P, Zdd, Possible)
SI Possible : Allera 2 SINON
Allera 1 FSI
{Appel}
Empiler(P, Zdd)
Zdd.X := Zdd.X * 2
Zdd.Y := Zdd.Y DIV 2
Allera 10
2 SI NON Pair(Zdd.Y) : R := R + Zdd.X FSI
{Retour}
Dépiler(P, Zdd, Possible)
SI Possible : Allera 2 SINON Allera 1 FSI
1 Ecrire( R)
3. Evaluation d'une expression arithmétique préfixée
Soient :
- Pileoper la pile des opérateurs ,
- Pileval la pile des résultats intermédiaires,
- V1 et V2 des variables réelles
- C une variable caractère
et soient :
- Nb(Pileoper) le nombre de '!' au sommet de la pile PileOper représentant le nombre
d'opérandes.
- Operation( Op, V1, V2) le module qui effectue l'opération Op entre V1 et V2.
On suppose que toutes les opérations sont binaires.
L'algorithme d'évaluation est le suivant :
Creerpile( Pileoper )
Creerpile( Pileval )
FIN := FAUX
TANTQUE NON FIN
Remplir
Evaluer
FINTANTQUE
Avec les modules Remplir et Evaluer définis comme suit :
Remplir :
Lire( C)
{ On suppose que la chaîne de caractères se termine par le caractère
"#" }
TANTQUE ( Nb(Pileoper) < 2 ET C <> '#' ) :
SI Operateur(C) :
Empiler( Pileoper, C)
SINON
Empiler(Pileval, Val(C)
)
Empiler(Pileoper, '!' )
FSI
Lire( C)
FINTANTQUE
FIN := ( C = '#' )
Evaluer :
TANTQUE ( Nb(Pileoper) = 2 ) :
Dépiler ( Pileoper, Op) ; Dépiler(Pileval,
V1);
Dépiler ( Pileoper, Op) ; Dépiler(Pileval,
V2);
Dépiler (Pileoper, Op)
Empiler (Pileval, Operation( Op, V1, V2) )
Empiler (Pileoper, '!')
FINTANTQUE