Chapitre 3 structures séquentielles

146
CHAPITRE III: STRUCTURES SÉQUENTIELLES Université Saad Dahlab – Blida1 Faculté des Sciences Département d’Informatique Licence d’Informatique Semestre 3 (2 ème année) Algorithmique et Structures de Données M me AROUSSI 2016-2017 Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/

description

structures séquentielles: listes linéaires chainées, files d'attente et piles

Transcript of Chapitre 3 structures séquentielles

Page 1: Chapitre 3 structures séquentielles

CHAPITRE III:

STRUCTURES SÉQUENTIELLES

Université Saad Dahlab – Blida1

Faculté des Sciences

Département d’Informatique

Licence d’Informatique

Semestre 3 (2ème année)

Algorithmique et Structures de Données

Mme AROUSSI

2016-2017

Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/

Page 2: Chapitre 3 structures séquentielles

PLAN DU CHAPITRE III

I. Introduction

II. Listes Linéaires Chaînées (LLC)

III. Files d’Attente (FIFO)

IV. Piles (LIFO)

2

Page 3: Chapitre 3 structures séquentielles

3

� Une structure séquentielle est un ensemble de variables

de même nature organisées séquentiellement auxquelles

on peut accéder :

� soit directement par leur numéro d’ordre

� soit en les parcourant une par une dans l’ordre

INTRODUCTION

Structures séquentielles

Listes linéaires contigües

Tableaux

Fichiers séquentiels

Listes chaînées Structures séquentielles particulières

Files

Piles

Page 4: Chapitre 3 structures séquentielles

PARTIE I:

LISTES LINÉAIRES CHAÎNÉES

(LLC)

Page 5: Chapitre 3 structures séquentielles

PLAN DE LA PARTIE I

� Définitions

� Modèle des LLC (MLLC)

� Algorithmes sur les listes

� Listes particulières

� Représentation contigüe

� Conclusion

5

Page 6: Chapitre 3 structures séquentielles

6

� Une Liste Linéaire Chaînées (LLC) est un ensemble de

maillons reliés entre eux.

� Un maillon est une entité renfermant de l’information et ayant

un pointeur sur le maillon qui la suit. C’est toujours une

structure (enregistrement) avec deux champs :

� un champ Valeur : contenant l'information

� un champ Suivant : donnant l'adresse du prochain maillon.

DÉFINITIONS

…….

val suiv

V1 @1 V2 @2 V3 @3 Vn @n

Page 7: Chapitre 3 structures séquentielles

Nil

7

� Une LLC est caractérisée par :

� L'adresse de son premier élément (la tête de liste). Elle doit

toujours être sauvegardée dans une variable pour pouvoir

manipuler la liste.

� NIL constitue l'adresse qui ne pointe aucun maillon (indiquant

par convention la fin de la liste).

� Si la liste est vide (ne contient aucun maillon), la tête doit alors

être positionnée à NIL.

DÉFINITIONS

Tête de liste

…….

val suiv

V1 @1 V2 @2 V3 @3 Vn @n

Tête

Page 8: Chapitre 3 structures séquentielles

Nil

8

DÉFINITIONS

Tête de liste

…….

val suiv

V1 @1 V2 @2 V3 @3 Vn @n

Langage

Algorithmique

Langage C

type Maillon = Structure

val : typeqq

suiv: * Maillon

fin

struct Maillon {

typeqq val ;

struct Maillon*suiv ;

};

Typedef struct Maillon {

typeqq val ;

struct Maillon*suiv ;

} Maillon;

Var Tête: *Maillon struct Maillon* Tête; Maillon* Tête;

où typeqq est un type simple (entier, réel, caractère, ...) ou

composé (tableau, chaîne de caractère, structure, …..)

Page 9: Chapitre 3 structures séquentielles

9

� On définit un ensemble d'opérations que l'on va utiliser pour écrire

des algorithmes sur les listes. Cet ensemble d'opérations s'appelle le

Modèle des Listes Linéaires Chaînées (MLLC) :

MODÈLE DE LLC (MLLC)

Modules Rôle

Allouer( P)C’est une procédure qui alloue (dynamiquement) un nouveaumaillon et affecte son adresse dans le pointeur P.

Libérer(P) C’est une procédure qui détruit le maillon pointé par P.

Valeur(P)C’est une fonction qui retourne le contenu du champs « val » dumaillon pointé par P (retourner (*P.val))

Suivant(P)C’est une fonction qui retourne le contenu du champs « suiv » dumaillon pointé par P (retourner (*P.adr))

Aff_Suiv(P, Q)C’est une procédure qui affecte le pointeur Q dans le champs «suiv » du maillon pointé par P (*P.suiv←←←←Q)

Aff_Val(P,v)C’est une procédure qui affecte la valeur v dans le champs « val »

du maillon pointé par P (*P.val←←←←v)

Page 10: Chapitre 3 structures séquentielles

10

� Voici l’équivalence en langage C, des fonctions et des procédures du

modèle :

MODÈLE DE LLC (MLLC)

Modules Implémentation en langage C

Allouer( P)struct Maillon *Allouer ( )

{ return ((struct Maillon *) malloc( sizeof(struct Maillon))); }

Libérer(P)Void Libérer ( struct Maillon *P)

{free (p);}

Valeur(P)typeqq Valeur( struct Maillon *P)

{ return( P->val) ; //équivalent à *P.val}

Suivant(P)struct Maillon *Suivant( struct Maillon *P)

{ return( P->suiv ); //équivalent à *P.suiv}}

Aff_Suiv(P, Qvoid aff_suiv( struct Maillon *P, struct Maillon *Q)

{ P->suiv = Q; //équivalent à *P.suiv=Q}

Aff_Val(P,v)void Aff_Val(struct Maillon *P, int v)

{ P->val =v; //équivalent à *P.val = v}

Page 11: Chapitre 3 structures séquentielles

11

� Parcours :

� Accès par valeur : il s'agit de rechercher (séquentiellement à

partir de la tête) une valeur v dans la liste.

� Accès par position : il s'agit de rechercher (séquentiellement à

partir de la tête) le maillon (son adresse) qui se trouve à une

position donnée. La position est le numéro d'ordre du maillon

dans la liste (entier).

ALGORITHMES SUR LES LLCS

Page 12: Chapitre 3 structures séquentielles

12

� Mises à jour :

� Construction d'une liste à partir de n valeurs données.

� Insertion d'une valeur (v) à une position donnée (i) : allouer un

nouveau maillon contenant v et l'insérer dans la liste de telle sorte

qu'il se retrouve à la i ème position.

� Insertion d'une valeur (v) dans une liste ordonnée : allouer un

nouveau maillon contenant v et l'insérer dans la liste de telle sorte

que la liste reste ordonnée après l'insertion.

ALGORITHMES SUR LES LLCS

Page 13: Chapitre 3 structures séquentielles

13

� Mises à jour :

� Suppression du maillon se trouvant à une position donnée :

rechercher par position le maillon et le libérer.

� Suppression d'une valeur v dans la liste : rechercher par

valeur et supprimer le maillon trouvé en mettant à jour le

précédent (s'il existe). Si la liste contient plusieurs occurrences de

la même valeur, on pourra les supprimer en faisant un seul

parcours de la liste.

� Destruction de tous les maillons d'une liste.

ALGORITHMES SUR LES LLCS

Page 14: Chapitre 3 structures séquentielles

14

� Tri sur les LLC : Les mêmes algorithmes de tri utilisable pour

les tableaux, en prenant en compte que l'accès par position coûte

beaucoup plus cher que dans un tableau.

� Algorithmes sur plusieurs LLC :

� Fusion (ou Interclassement) de deux listes ordonnées : à

partir de 2 listes ordonnées, construire une liste ordonnée

contenant tous leurs éléments (sans allouer de nouveaux

maillons).

� Eclatement d'une liste en 2 listes distinctes : à partir d'une

liste L et d'un critère (un prédicat) donné, on construit deux

listes, l'une contenant toutes les valeurs de L vérifiant le critère,

l'autre, celles qui ne le vérifient pas.

ALGORITHMES SUR LES LLCS

Page 15: Chapitre 3 structures séquentielles

15

� Exercice 1: Soient L une liste d’entier non ordonnée.

Développer les modules suivants:

a. Imprimer la liste

b. Calculer la longueur de la liste.

c. Rechercher le maillon contenant la valeur « v » dans

la liste

d. Rechercher le maillon qui se trouve à la position K

e. Insérer une valeur « v » dans la liste

f. Insérer une valeur « v » à la position k

g. Construire la liste à partir de n données lues.

ALGORITHMES SUR LES LLCS

Page 16: Chapitre 3 structures séquentielles

16

� Exercice 1 (suite): Soient L une liste d’entier non

ordonnée. Développer les modules suivants:

h) Supprimer une valeur « v » dans la liste.

i) Supprimer tous les maillons contenant la valeur

« v ».

j) Supprimer le maillon de position « pos ».

k) Détruire la liste

ALGORITHMES SUR LES LLCS

Page 17: Chapitre 3 structures séquentielles

17

� Soient la liste suivante:

� La liste imprimée est 2, 10, 5, -1 et 6

ALGORITHMES SUR LES LLCS

IMPRESSION

2 10 5 -1 6

L

Procédure ImprimerLLC (L:*maillon)Début P �L;Tant que (P≠nil) faire // la liste n’est pas videDTQ

écrire (valeur (P))P ←suivant (P)

FTQFin

Page 18: Chapitre 3 structures séquentielles

18

� Soient la liste suivante:

� La longueur de cette liste = 5

ALGORITHMES SUR LES LLCS

LONGUEUR

2 10 5 -1 6

L

Fonction LongLLC (L:*maillon): entierDébut P �L; Cpt �0;Tant que (P≠nil) faire // la liste n’est pas videDTQ

Cpt ++P ←suivant (P)

FTQRetourner (Cpt)Fin

Page 19: Chapitre 3 structures séquentielles

19

� Rechercher une valeur « v=5 » dans la liste suivante:

� Si v= 1 alors

la fonction retourne nil.

ALGORITHMES SUR LES LLCS

RECHERCHE

2 10 5 -1 6

L

Fonction RechLLC (L:*maillon, v:entier): *maillonDébut P ←LTant que (P≠nil) faire // la liste n’est pas videDTQ

Si valeur (P) = v alors retourner (P)

Sinon P ←suivant (P)

FTQRetourner (nil)Fin

P

Page 20: Chapitre 3 structures séquentielles

20

� Rechercher le maillon qui se trouve à la position k = 4

� Si k= 6, le maillon n’existe même pas (P = nil)

ALGORITHMES SUR LES LLCS

RECHERCHE

2 10 5 -1 6L

Fonction RechLLC_pos(L: *maillon, K: entier positif): *maillonDebutP ←L; i ←1Tant que (i<K) et (P≠nil) faire //accéder au K ème maillonDTQ

i++; P ←suivant (P);FTQRetourner (P);Fin

P

Page 21: Chapitre 3 structures séquentielles

21

� Pour ajouter un élément dans la liste, il y a plusieurs

situations :

1. Insertion au début de la liste

2. Insertion à la fin de la liste

3. Insertion à une position donnée

ALGORITHMES SUR LES LLCS

INSERTION

Page 22: Chapitre 3 structures séquentielles

22

� Cas 1: Insertion au début

ALGORITHMES SUR LES LLCS

INSERTION

-1 5 10 26

L

Paff_suiv (P, L)

Procédure InsererLLC_Deb(L:*maillon, v:entier)Début Allouer (P)aff_val(P, v) aff_suiv(P, L)L←P //mettre à jour la tête de la listeFin

Page 23: Chapitre 3 structures séquentielles

23

� Cas 2: Insertion à la fin.

ALGORITHMES SUR LES LLCS

INSERTION

2 10 5 -1 6

L Q P

aff_suiv (Q, P)

Procédure InsererLLC_Fin (L:*maillon, v:entier)Début Allouer (P); aff_val(P, v); aff_suiv(P, nil)Si (L=nil) alors //la liste est vide

L ←P // mettre à jour l’entêteSinon

DsinonQ ←LTant que (suivant (Q)≠nil) faire // accéder au dernier maillon

Q ←suivant (Q)aff_suiv (Q, P)Fsinon

Fin

Page 24: Chapitre 3 structures séquentielles

24

� Cas 3: Insertion à une position donné « k ».

� Si k = 1 alors insérer le maillon au début

� Sinon, accéder d’abord au maillon de position « k -1 »,

ensuite refaire le chaînage comme suit;

ALGORITHMES SUR LES LLCS

INSERTION

2 10 5 -1

6

L Q

P

(1) aff_suiv (P, suivant (Q))

k

(2) aff_suiv (Q, P)

Page 25: Chapitre 3 structures séquentielles

25

ALGORITHMES SUR LES LLCSINSERTION

2 10 5 -1

6

L Q

P (1) aff_suiv (P, suivant (Q))

Procédure InsererLLC_pos (L:*maillon, k: entier positif, v:entier, var possible: booléen)Début possible �fauxSi (k>0) alors

Si (k=1) alors InsererLLC_Deb(L, v)possible � vrai

Sinon Q ←RechLLC_pos (L, k-1) ;

Si ((Q ≠ nil) et et (suivant (Q) ≠ nil)) // la position k existeAllouer (P); aff_val(P, v) ;aff_suiv (P, suivant (Q)) ; aff_suiv (Q, P)possible � vrai

Fin

k

(2) aff_suiv (Q, P)

Page 26: Chapitre 3 structures séquentielles

26

� Pour créer une liste:

1. Allouer un nouveau maillon

2. Initialiser le maillon avec la valeur lue

3. Insérer dans la liste. On distingue deux cas:

a. Insertion à la fin

b. Insertion au début et la liste crée est inversée

ALGORITHMES SUR LES LLCS

CRÉATION

val suiv

??? ???

val suiv

2 NIL

Page 27: Chapitre 3 structures séquentielles

27

� Cas 1: Insertion à la fin. Soient N= 5 et les valeurs suivantes: 2, 10, 5, -1, 6

ALGORITHMES SUR LES LLCS

CRÉATION

2 10 5 -1

6

LQ

P

aff_suiv (Q, P)

Procédure CreerLLC (L:*maillon)Début Pour i←1 à N faire DP

lire (x) Allouer (P)aff_val(P, x)

aff_suiv(P, nil)Si (L=nil) alors //la liste est vide

L ←P // mettre à jour l’entêteSinon

aff_suiv(Q, P)Q←P //sauvegarder l’@ du dernier maillon

FPFin

Procédure CreerLLC (L:*maillon)Début Pour i←1 à N faire DP

lire (v) InsererLLC_Fin(L, v)

FPFin

Page 28: Chapitre 3 structures séquentielles

28

� Soient N= 5 et les valeurs suivantes: 2, 10, 5, -1, 6

� Cas 2: Insertion au début

ALGORITHMES SUR LES LLCS

CRÉATION

-1 5 10 2

6

L

Paff_suiv (P, L)

Procédure CreerLLC_inverse (L:*maillon)DébutPour i←1 à N faire DP

lire (x) Allouer (P)aff_val(P, x)

aff_suiv(P, nil)aff_suiv(P, L)L←P //mettre à jour la tête de la liste

FPFin

Procédure CreerLLC_inversé (L:*maillon)DébutPour i←1 à N faire

lire (v)InsérerLLC_Deb( L, v)

Fin

Page 29: Chapitre 3 structures séquentielles

29

� Pour supprimer un maillon contenant la valeur v, il faut

d’abord rechercher ce maillon. Une fois trouvé (soit P ce

maillon), on va refaire le chaînage (son précédent avec

son suivant), ensuite, libérer le maillon P.

ALGORITHMES SUR LES LLCS

SUPPRESSION

Page 30: Chapitre 3 structures séquentielles

30

� Exemple 1: Suppression v = 5

� Exemple 2 : Suppression v = 2

ALGORITHMES SUR LES LLCS

SUPPRESSION

2 10 5 -1 6

L

2 10 5 -1 6

PL

2 10 5 -1

L Q P

6

Q

Page 31: Chapitre 3 structures séquentielles

31

ALGORITHMES SUR LES LLCS

SUPPRESSION

Procédure SupprimerLLC (L:*maillon, v:entier)Début P←L; Q�nil

TQ ((P ≠ nil) et (valeur (P) ≠ v) ) Q←P; P ←suivant (P)

FTQSi (P ≠ nil) alors

Si Q = nil alorsL ← suivant (P);

Sinon aff_suiv(Q,suivant (P));

libérer (P)Fin

/* rechercher le premier maillon contenant v*/

/* Suppression du premier maillon */

Page 32: Chapitre 3 structures séquentielles

32

� Suppression de tous les maillons contenant la valeur v

ALGORITHMES SUR LES LLCS

SUPPRESSION

Procédure SupprimerLLC_tous (L:*maillon, v:entier)Début P←L; Q�nilTQ (P ≠≠≠≠ nil)

TQ ((P ≠ nil) et (valeur (P) ≠ v) ) Q←P; P ←suivant (P)

FTQSi (P ≠ nil) alors

Si Q = nil alorsL ← suivant (P); S����L;

Sinon aff_suiv(Q,suivant (P)); S����suivant (P);

libérer (P)P ����S;

Fin

/* rechercher le premier maillon contenant v*/

/* Suppression du premier maillon */

Page 33: Chapitre 3 structures séquentielles

33

� Suppression à une position donnée « k ».

� Deux situations se présentent:

� k = 1, supprimer le premier maillon

� k ≠ 1, accéder d’abord au maillon de position « k-1»,

sauvegarder l’adresse du maillon « k+1 », ensuite

refaire le chaînage comme suit;

ALGORITHMES SUR LES LLCS

SUPPRESSION

2 10 5 -1

L Q

k

P

Page 34: Chapitre 3 structures séquentielles

34

� Suppression à une position donné « k ».

ALGORITHMES SUR LES LLCS

SUPPRESSION

Procédure Supprimer_pos (L:*maillon, k:entier positif, Var possible : booléen) Début Possible �fauxSi (k>0) alors

Si (k = 1) alors // supprimer le premier maillonP←L; L ← suivant (L); libérer (P); Possible �vrai

Sinon Q←Rech_pos(L, k-1)Si ((Q ≠ nil) et (suivant (Q) ≠ nil)) // la position k existe

P� suivant (Q); aff_suiv(Q,suivant (P)); libérer (P); Possible �vrai

Fin

Page 35: Chapitre 3 structures séquentielles

35

� Soient la liste suivante:

ALGORITHMES SUR LES LLCS

DESTRUCTION

2 10 5 -1 6

L

Procédure DetruireLLC (L:*maillon)Début Tant que (L≠nil) faire // la liste n’est pas videDTQ

P←LL ←suivant (L)libérer (P)

FTQFin

2 10 5 -1 6

LP

Page 36: Chapitre 3 structures séquentielles

36

� Liste circulaire est une LLC où le dernier maillon

pointe le premier, formant ainsi un cercle.

� La tête de la liste est l'adresse de n'importe quel maillon.

� Le même modèle des LLC est utilisé pour écrire des

algorithmes sur ce type de listes: MLLCcir = MLLC

LISTES PARTICULIÈRES

LISTE CIRCULAIRE

…….V1 @1 V2 @2 V3 @3 Vn @n

Tête

Page 37: Chapitre 3 structures séquentielles

37

� Impression d’une LLC circulaire

LISTES PARTICULIÈRES

LISTE CIRCULAIRE (QUELQUES ALGORITHMES)

2 10 5 -1L

Procédure ImprimerLLCcir (L:*maillon)Début Si L ≠ nil alors

P←LRépéter

Écrire (valeur (P))P ←suivant(P)

Jusqu’à P=LFin

P

Page 38: Chapitre 3 structures séquentielles

38

� Recherche le premier maillon contenant la valeur v

LISTES PARTICULIÈRES

LISTE CIRCULAIRE (QUELQUES ALGORITHMES)

2 10 5 -1L

Fonction RechLLC_cir (L:*maillon, v:entier): *maillonDébut Si L ≠ nil alors

P←LRépéter

Si (valeur (P) = v) alors retourner (P)

P ←suivant(P)Jusqu’à P=L

Retourner (nil)Fin

P

Page 39: Chapitre 3 structures séquentielles

39

� Insertion dans une LLC circulaire

LISTES PARTICULIÈRES

LISTE CIRCULAIRE (QUELQUES ALGORITHMES)

2 10 5 -1

6

L

Procédure InsererLLCcir (L:*maillon, v:entier)Début Allouer (P)aff_val(P, v)

Si (L=nil) alors //la liste est videaff_suiv(P, P)L ←P // mettre à jour l’entête

Sinon aff_suiv(P , suivant (L))

aff_suiv (L, P)

Fin

P

Q

Page 40: Chapitre 3 structures séquentielles

40

� Construction d’une LLC circulaire

� Construire une LLC unidirectionnel

� À la fin, chaîner le dernier maillon avec le premier

LISTES PARTICULIÈRES

LISTE CIRCULAIRE (QUELQUES ALGORITHMES)

2 10 5 -1 6L

Procédure CreerLLCcir (L:*maillon, N:entier)Début Pour i←1 à N faire

lire (x) Allouer (P); aff_val(P, x)Si (L=nil) alors L ←P // mettre à jour l’entêteSinon aff_suiv(Q, P)Q←P //sauvegarder l’@ du dernier maillon

aff_suiv (P, L);Fin

Q P

Page 41: Chapitre 3 structures séquentielles

41

� Construction d’une LLC circulaire

LISTES PARTICULIÈRES

LISTE CIRCULAIRE (QUELQUES ALGORITHMES)

2 10 5 -1 6L

2 éme Méthode Procédure CreerLLCcir (L:*maillon, N:entier)Début Pour i←1 à N faire

lire (x); Allouer (P); aff_val(P, x) Si (L=nil) alors //la liste est vide

L ←P // mettre à jour l’entêteSinon

aff_suiv(Q, P)aff_suiv(P, L)// lier le dernier maillon au premierQ←P //sauvegarder l’@ du dernier maillon

Fin

Q P

Page 42: Chapitre 3 structures séquentielles

42

� Suppression du maillon contenant la valeur v

� Rechercher le maillon contenant la valeur v

� S’il existe un tel maillon, on distingue deux cas:

1. La valeur se trouve dans le maillon « L »,

a. Si la liste contient qu’un seul maillon, alors la liste devient

vide

b. Sinon, mettre à jour le pointeur L et refaire le chaînage.

2. La valeur se trouve dans un autre maillon (≠ L), refaire le

chaînage

LISTES PARTICULIÈRES

LISTE CIRCULAIRE (QUELQUES ALGORITHMES)

2 10 5 -1L

Page 43: Chapitre 3 structures séquentielles

43

� Suppression du maillon contenant la valeur v

LISTES PARTICULIÈRES LISTE CIRCULAIRE

(QUELQUES ALGORITHMES)

Procédure SupprimerLLCcir (L:*maillon, v:entier)Début Si (L ≠ nil) alors // la liste n’est pas vide

P←Lrépéter

Q←PP ←suivant (P)

jusqu’à (P = L) ou (valeur (P) =v )Si valeur (P) =v alors // il existe un maillon contenant la valeur v

Si P = L alors //la valeur se trouve dans le maillon LSi P = Q alors // la liste contient un seul maillon

L ← nilSinon

L ← suivant (P); aff_suiv(Q,suivant (P))Sinon

aff_suiv(Q,suivant (P))libérer (P)

Fin

//rechercher le mailloncontenant la valeur v

Page 44: Chapitre 3 structures séquentielles

44

� Destruction d’une LLC circulaire

LISTES PARTICULIÈRES

LISTE CIRCULAIRE (QUELQUES ALGORITHMES)

2 10 5 -1L

Procédure DetruireLLC_cir (L:*maillon)Début Si L≠nil alors

P ←suivant (L) TQ (P≠L) faire

aff_suiv(L, suivant (P))libérer (P)P ←suivant (L)

FTQLibérer (P); L ←nil;

Fin

Page 45: Chapitre 3 structures séquentielles

45

� Liste bidirectionnelle ou Liste Doublement

Chaînées est une liste que l'on peut parcourir dans les

deux sens : de gauche à droite (pour aller au maillon

suivant) et de droite à gauche (pour aller au maillon

précédent).

� Elle est définit par sa tête, aussi que par sa queue.

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE

Tête

Nil

V1 V2 V3 V4 V5

Nil

Queue val suiv

prec

Page 46: Chapitre 3 structures séquentielles

� Chaque maillon d’une liste bidirectionnelle comporte trois champs:

� Un champ contenant la donnée.

� Un pointeur vers l'élément suivant de la liste.

� Un pointeur vers l'élément précédent de la liste.

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE

val suiv

type MaillonBD = Structure

val : typeqq

suiv: * MaillonBD

prec:*MaillonBD

fin

prec

46

type ListeBD= Structure

Tête: * MaillonBD

Queue:*MaillonBD

fin

Var L: ListeBD

Page 47: Chapitre 3 structures séquentielles

� Le modèle des LLC bidirectionnelles est donc étendu par les

opérations suivantes :

MLLCbd = MLLC + { Init, Aff_prec, Précédent }

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE

47

Fonction Rôle

Init (L) Initialiser la tête et la queue à Nil

Précédent(P) Accéder au champ « prec » du maillon d'adresse P.

Aff_prec(P, Q)Modifier le champ « prec » du maillon d'adresse P en lui affectant

le pointeur Q.

val suivprec

Page 48: Chapitre 3 structures séquentielles

48

� Impression d’une LLC Bidirectionnelle

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

Tete

2 5 -1 6

Queue

Procédure ImprimerLLCbd (Var L: ListeBD)Début T�L.TeteTant que (T≠nil) faire // la liste n’est pas vide

écrire (valeur (T))T ←suivant (T)

Fin La liste imprimée est 2, 5, -1, 6

Procédure ImprimerLLCbd_inverse(Var L: ListeBDDébutQ � L.QueueTant que (Q≠nil) faire // la liste n’est pas vide

écrire (valeur (Q))Q ←precedent (Q)

Fin La liste imprimée est 6, -1, 5, 2

Page 49: Chapitre 3 structures séquentielles

49

� Recherche d’une valeur dans une LLC Bidirectionnelle

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

Fonction RechLLCbd(L: ListeBD, v:entier): *MaillonBDDébut P ←L.TeteTant que (P≠nil) faire // la liste n’est pas vide

Si valeur (P) = v alors retourner (P)Sinon P ←←←←suivant (P)

Retourner (nil)Fin

Tete

2 5 -1 6

Queue

Fonction RechLLCbd (L: ListeBD, v:entier): *MaillonBDDébut P ←L.QueueTant que (P≠nil) faire // la liste n’est pas vide

Si valeur (P) = v alors retourner (P)Sinon P ←←←←précédent (P)

Retourner (nil)Fin

Page 50: Chapitre 3 structures séquentielles

50

� Recherche du maillon qui se trouve à une position donnée

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

K

Tete

2 5 -1 6

QueueP

RechLLCbd_pos(L: ListeBD, K: entier positif): *maillonBDDebutP ←L.Tete; i ←1Tant que (i<K) et (P≠nil) faire //accéder au K ème maillonDTQ

i++; P ←suivant (P);FTQRetourner (P);Fin

Page 51: Chapitre 3 structures séquentielles

51

� Insertion au début de la liste

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

Aff_suiv (P, Tete)Tete

Queue

-1 5 26

P

Aff_prec (Tete, P)

Procédure InsererLLCbd_Deb (Var L: ListeBD, v:entier)Début Allouer (P); aff_val(P, v); Si L.Tete = nil alors // si la liste est vide

aff_suiv(P, nil); aff_prec(P, nil)L.Tete ←P; L.Queue ←P

Sinon aff_prec (P, nil);aff_suiv (P, L.Tete) ; aff_prec (L.Tete, P)L.Tete←←←←P //mettre à jour la tête

Fin

Page 52: Chapitre 3 structures séquentielles

52

� Insertion à la fin de la liste.

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

Procédure InsererLLCbd_Fin (Var L: ListeBD, v:entier)Début Allouer (P); aff_val(P, v); Si L.Queue = nil //la liste est vide

aff_suiv(P, nil); aff_prec(P, nil)L.Tete ←P; L.Queue ←P

Sinon aff_suiv(P, nil)aff_suiv (L.Queue, P); aff_prec (P, L.Queue)L.Queue←←←←P //mettre à jour la queue

Fin

Aff_suiv (Queue, P)Tete

Queue

2 5 -1 6

P

Aff_prec (P, Queue)

Page 53: Chapitre 3 structures séquentielles

53

� Insertion à une position donnée

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

P

K

Tete

2 5 -1 6

QueueS6

(1)(2)

(3)

(4)

Procédure InsererLLCbd_pos (Var L: ListeBD, v:entier, K:entier positif)Si K>0 alors

Si K = 1 alors InsererLLCbd_Deb(L, v)Sinon

S�RechLLCbd_pos(L, K):;Si S ≠ NilAllouer (P); aff_val(P, v); aff_suiv (Precedent (S), P) ; aff_prec (P, Precedent (S)); aff_suiv (P, S) ;aff_prec (S, P) ;

Page 54: Chapitre 3 structures séquentielles

54

� Construction d’une LLC Bidirectionnelle

� Soient N= 4 et les valeurs suivantes: 2, 5, -1, 6

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

Aff_suiv (Q, P)Tete

Queue

2 5 -1 6

P

Aff_prec (P, Q)

Procédure CreerLLCbd (Var L: ListeBD)Début Init (L)Pour i←1 à N faire

lire (x); InsererLLCbd_Fin (L, x);

Fin

Page 55: Chapitre 3 structures séquentielles

55

� Construction d’une LLC Bidirectionnelle

� Soient N= 4 et les valeurs suivantes: 2, 5, -1, 6

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

Aff_suiv (P, T)

Tete Queue

-1 5 26

P

Aff_prec (T, P)

Procédure CreerLLCbd_inverse(Var L: ListeBD)Début Init (L)Pour i←1 à N faire

lire (x); InsererLLCbd_Deb (L, x);

Fin

Page 56: Chapitre 3 structures séquentielles

56

� Suppression du maillon contenant la valeur v

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

2 5 -1 6

Procédure SupprimerLLCbd (Var L: ListeBD v:entier)Si (L.Tete ≠ nil) alors // la liste n’est pas vide

P← RechLLCbd (L, v)Si P ≠ nil alors // il existe un maillon contenant la valeur v

Si P = L.Tete = L.Queue alors // la liste contient un seul maillonInit (L)// T ←←←←nil; Q ←←←←nil i.e. la liste devient vide

Sinon Si P = L.Tete alors //suppression au débutL.Tete ← suivant (P); aff_prec(L.Tete, nil);

Sinon Si P = L.Queue alors //suppression à la finL.Queue← précédent (P); aff_suiv(L.Queue, nil)Sinon

aff_suiv(precedent (P), suivant(P));aff_prec(suivant(P), precedent (P));

libérer (P)

QueueTete P

Page 57: Chapitre 3 structures séquentielles

57

� Destruction d’une LLC Bidirectionnelle

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES)

Tete

2 5 -1 6

Queue

Procédure DetruireLLCbd (Var L: ListeBD)Début T�L.TeteTant que (T≠nil) faire

P←TT ←←←←suivant (T)libérer (P)

Init (L);Fin

Procédure DetruireLLCbd (Var L: ListeBD)Début Q�L.QueueTant que (Q≠nil) faire

P←QQ ←←←←precedent (Q)libérer (P)

Init (L);Fin

Page 58: Chapitre 3 structures séquentielles

58

� Liste bidirectionnelle circulaire est une LLC à double

sens et dont le dernier maillon pointe sur le premier

maillon et le premier maillon pointe sur le dernier

maillon.

� Le même modèle des LLCs bidirectionnel est utilisé pour

écrire des algorithmes sur ce type de liste:

MLLCbdcir = MLLCbd

LISTES PARTICULIÈRES

LISTE BIDIRECTIONNELLE CIRCULAIRE

Tête

V1 V2 V3 V4 V5

Page 59: Chapitre 3 structures séquentielles

59

� On peut représenter une LLC par un tableau où chaque

élément contient au moins 3 champs : l'information,

l’indice du suivant et l’indicateur vide.

� Exemple d’une LLC unidirectionnel:

REPRÉSENTATION CONTIGÜE

DÉFINITION

Tête

12 8 23 45

Nil

Vide Val Suiv

F 12 4

F 23 7

V

F 8 2

V

V

F 45 -1

Tête = 0

Page 60: Chapitre 3 structures séquentielles

60

� Initialement, le champ Vide de tous les éléments sont à

vrai pour indiquer que les cases sont disponibles.

� Une LLC est définie par l'indice de son premier élément

dans le tableau T

Vide Val Suiv

F 12 4

F 23 7

V

F 8 2

V

V

F 45 -1

Définition de la structure :

type element = Structurevide : Booléenval : typeqqsuiv : Entier

fin

var Liste : tableau [Max] de element

Tête = 0

REPRÉSENTATION CONTIGÜE

DÉFINITION

Page 61: Chapitre 3 structures séquentielles

61

� Le modèle de la LLC est défini comme suit:

Modules Rôle

Allouer(L, N)C’est une fonction qui retourne l’indice de la case libre dans letableau L du taille max sinon la valeur -1 s'il n’y a pas deplace.

Libérer(L,P)C’est une procédure qui positionne le champs « vide » de lacase L[P] à vrai

Valeur(L, P)C’est une fonction qui retourner le contenu du champs « val »de la case L[P].

Suivant(L, P)C’est une fonction qui retourne le contenu du champs « suiv »de la case L[P]

aff_suiv(L, P, Q)C’est une procédure qui affecte l’entier Q dans le champs «suiv » de la case L[P]

Aff_Val(L, P,v)C’est une procédure qui affecte la valeur v dans le champs «

val » de la case L[P]

REPRÉSENTATION CONTIGÜEMODÈLE

Page 62: Chapitre 3 structures séquentielles

62

Modules Code Complexité

Allouer(L, max) Pour i←0 à max-1 faireSi L[i].Vide alors

L[i] ←fauxRetourner(i)

Retourner (-1)

O(max)

Libérer(L,P) L[P].Vide ← vrai O(1)

Valeur(L, P) Retourner (L [P].val) O(1)

Suivant(L, P) Retourner (L [P].suiv) O(1)

aff_suiv(L, P, Q) L[P] .suiv← Q O(1)

Aff_Val(L, P, v) L[P] .val← v O(1)

REPRÉSENTATION CONTIGÜEMODÈLE

Page 63: Chapitre 3 structures séquentielles

Faut-il utiliser

un tableau ou

une LLC?

CONCLUSION

63

Page 64: Chapitre 3 structures séquentielles

64

Tableau non ordonné LLC unidirectionnelle non ordonné

Accès à un élément

Direct (O(1)) Séquentielle (O(n))tq n est la longueur de la liste

Ajout Recherche séquentielle d’une case

vide O(n)

Chaînage:

Au début O(1)A la fin O(n)

Suppression Décalage O(n)

Chaînage:

Au début O(1)À la fin O(n)

Définition de la relation suivant:

Implicitedéfinie par la contiguïté

des composantes du tableau

ExpliciteOn peut la modifier , i.e. les

maillons des LLC peuvent être réarrangés sans avoir à déplacer les informations qu’ils portent).De plus, un même maillon peut faire partie de plusieurs listes.

CONCLUSION

Page 65: Chapitre 3 structures séquentielles

65

Tableau non ordonné LLC unidirectionnelle non ordonné

Sur-

encombrement

Non:

La relation suivant étant

implicite, il n’y a pas besoin

d’espace supplémentaire pour

son codage.

Oui:

l’encombrement de chaque

maillon est augmenté de la

taille du pointeur suivant

Encombrement

total selon le

besoin

Non:

avec l’allocation statique,

l’encombrement d’un tableau

est constant (fixé d’avance).

Oui:

avec l’allocation dynamique

des maillons, le nombre de

maillons d’une LLC

correspond au nombre

d’éléments effectivement

présents

CONCLUSION

Page 66: Chapitre 3 structures séquentielles

PARTIE II:

FILES D’ATTENTE

Page 67: Chapitre 3 structures séquentielles

PLAN DE LA PARTIE II

� Définition

� Utilisation

� Modèle

� Implémentation

� Représentation statique

� Représentation dynamique

� File d’attente avec priorité 67

Page 68: Chapitre 3 structures séquentielles

68

� Une file (en anglais queue) est une structure de données

basée sur le principe « premier arrivé, premier sorti » (en

anglais FIFO: First In First Out),

� Le fonctionnement ressemble à une file d'attente : les

premières personnes à arriver sont les premières

personnes à sortir de la file.

DÉFINITION

Page 69: Chapitre 3 structures séquentielles

69

� Une file d'attente peut être définie comme une collection

d'éléments dans laquelle tout nouvel élément est inséré

(ajouté) à la fin (queue) et tout élément ne peut être

supprimé (retiré) que du début (Tête).

DÉFINITION

Retrait (Défilement )Ajout (enfilement)

têtequeue

Page 70: Chapitre 3 structures séquentielles

70

� Les files d’attente sont utilisées, en programmation

comme des buffers (mémoire tampon = espace de

mémorisation temporaire) , pour gérer des objets qui

sont en attente d’un traitement ultérieur, tel que la

gestion des documents à imprimer, des programmes à

exécuter, des messages reçus,...etc.

� Elles sont utilisées également dans le parcours des

arbres.

UTILISATION

Page 71: Chapitre 3 structures séquentielles

71

� Les opérations habituelles sur les files sont :

� Initialisation de la file

� Vérification du contenu de la file (vide ou pleine)

� Enfilement : ajout d’un élément à la queue de la file

� Défilement : retrait d’un élément de la tête de la file

MODÈLE

Opération Rôle

Initfile(F) créer une file vide

Enfiler(F,Val) ajouter Val à la queue de file

Défiler(F,Val) retirer dans Val l'élément en tête de file

Filevide(F) tester si la file est vide

Filepleine(F) tester si la file est pleine

Page 72: Chapitre 3 structures séquentielles

72

� Les files d’attente peuvent être présentées en deux

manières:

� statique en utilisant les tableaux,

� dynamique en utilisant les listes linéaires

chaînées.

� L’implémentation statique peut être réalisée par

� décalage en utilisant un tableau avec une tête fixe,

toujours à 0, et une queue variable.

� tableau circulaire où la tête et la queue sont toutes

les deux variables.

IMPLÉMENTATION

Page 73: Chapitre 3 structures séquentielles

73

� A chaque défilement, on fait un décalage.

� La tête n'est plus une caractéristique puisqu'elle est toujours

égale à 0.

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

V0 V1 V2 V3 V4 V5

Tête = 0 Queue = 5

Défiler

Décalage

V1 V2 V3 V4 V5

Queue = 4

Page 74: Chapitre 3 structures séquentielles

74

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

Définition de la structure :

TYPE File_Attente = STRUCTURE

Elements : TABLEAU[Max] de Typeqq

Queue : ENTIER

FIN

VAR F : File_Attente

V1 V2 V3 V4 V5 V6

Queue

File_Attente

Eléments

Page 75: Chapitre 3 structures séquentielles

75

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

Modèle Implémentation

Initfile(F) F.Queue ←-1

Filevide(F) Retourner (F.Queue = -1)

Filepleine(F) Retourner (F.Queue = Max-1)

Enfiler(F,X) SI (NON Filepleine(F))

F.Queue ← F.Queue + 1

F.Elements[F.Queue] ←X

Defiler(F,X) SI (NON Filevide(F))

X ← F.Elements[0]

POUR I ← 0 à F.Queue - 1

F.Elements[I] ← F.Elements[I+1]

F.Queue ← F.Queue – 1

Page 76: Chapitre 3 structures séquentielles

76

� Les incrémentations se font modulo N afin de réutiliser des

cases libérées:

Tete ←←←← (Tete+1) mod Max & Queue ←←←← (queue+1) mod Max

� Par convention,

� L'élément d'indice tête sera sacrifié (case vide).

� Le premier élément se trouve alors à l'indice (tête+1 mod

Max)

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

V0 V1 V2 V3 V4 V5

Tête = 8Queue = 5

Page 77: Chapitre 3 structures séquentielles

77

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

V1 V2 V3 V4 V5

Tête = 0 Queue = 5

V2 V3 V4 V5

Tête = 1 Queue = 5

Tête = Queue = 5

� Défiler (F, V)

� Pour i←←←←1 à 4 faire Défiler (F, V)

File Vide ssi Tête = Queue

Page 78: Chapitre 3 structures séquentielles

78

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

V3 V4 V5 V6 V7 V8

Tête = 2 Queue = 8

V9 V3 V4 V5 V6 V7 V8

Tête = 2Queue = 0

� Enfiler (F, V9)

V9 V10 V3 V4 V5 V6 V7 V8

Tête = 2Queue = 1

� Enfiler (F, V10)File Pleine ssi :tete = (queue+1) mod Max

Queue ←←←← (queue+1) mod Max

Page 79: Chapitre 3 structures séquentielles

79

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

Définition de la structure :

TYPE File_Attente = STRUCTURE

Elements : TABLEAU[Max] de Typeqq

Tête, Queue : ENTIER

FIN

VAR F : File_Attente

File_Attente

Eléments

V2 V3 V4 V5

Tête = 1 Queue = 5

Page 80: Chapitre 3 structures séquentielles

80

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

Modèle Implémentation

Initfile(F) F.Tête ←Max; F.Queue ←Max

Filevide(F) Retourner (F.Tête = F.Queue)

Filepleine(F) Retourner (F.Tête = ( (F.Queue +1) Mod Max ))

Enfiler(F,X) SI (NON Filepleine( F))

F.Queue ← (F.Queue + 1) Mod Max

F.elements[F.Queue] ← X

Defiler(F,X) SI (NON Filevide(F))

F.Tete ← (F.Tete + 1)Mod Max

X ← F.elements[F.Tete]

Page 81: Chapitre 3 structures séquentielles

81

� La représentation dynamique utilise une liste linéaire chaînée

(LLC). L’enfilement se fait à la queue de la liste et de

défilement se fait de la tête. La file d’attente, dans ce cas, peut

devenir vide, mais ne sera jamais pleine.

� Les opérations de base sont :

� Initialisation de la file

� Enfilement : insertion d’un élément à la queue de la LLC

� Défilement : suppression d’un élément de la tête de la LLC

� Vérification si la LLC n’est pas vide

IMPLÉMENTATION DYNAMIQUE

V0 V1 V2 V3 V4

Tête Queue

EnfilementDéfilement

Page 82: Chapitre 3 structures séquentielles

82

IMPLÉMENTATION DYNAMIQUE

V0 V1 V2 V3 V4

Tête Queue

Définition de la structure :

TYPE Maillon = STRUCTURE

val : typeqq

suiv: * Maillon

FIN

TYPE File_Attente = STRUCTURE

Tête, Queue : *Maillon

FIN

VAR F: File_Attente

File_Attente

Page 83: Chapitre 3 structures séquentielles

83

IMPLÉMENTATION DYNAMIQUE

Modèle Implémentation

Initfile(F) F.Tete ← NIL; F.Queue← NIL

Filevide(F) Retourner (F.Tete = NIL )

Enfiler(F,X) Allouer (P), Aff_Val(P, X), aff_suiv(P, NIL)

SI (NON Filevide(F))

aff_suiv(F.Queue, P)

SINON

F.Tete ← P

F.Queue ← P

Defiler(F,X) SI (NON Filevide(F))

P ← F.Tete

X ← Valeur(F.Tete)

F.Tete ← Suivant(F.Tete)

Liberer(P)

Page 84: Chapitre 3 structures séquentielles

84

� Une file d’attente avec priorité est une collection

d’éléments dans laquelle l’insertion ne se fait pas toujours

à la queue.

� Tout nouvel élément est inséré dans la file, selon sa

priorité.

� Le retrait se fait toujours du début.

� Dans une file avec priorité, un élément prioritaire

prendra la tête de la file même s’il arrive le dernier.

� Un élément est toujours accompagné d’une information

indiquant sa priorité dans la file.

FILE D’ATTENTE AVEC PRIORITÉ

Page 85: Chapitre 3 structures séquentielles

85

�Exercice 6:

� Le processeur possède un buffer permettant de gérer ses programmes

à exécuter. Ce buffer est une file d'attente avec priorité où les

éléments (programmes) sont caractérisés par une priorité

d’exécution: un programme de priorité supérieure est servi même s’il

n’est pas arrivé le premier.

� Sachant qu’un programme est défini par sa priorité et son mot d’état

programme (Program Status Word ou PSW) qui regroupe l’adresse de

la prochaine instruction (CO) et les bits du registre de flag. Définir

les structures de données nécessaires ainsi que le modèle de

file, pour chaque type de présentation (statique par décalage,

statique par tableau circulaire et dynamique).

FILE D’ATTENTE AVEC PRIORITÉ

Page 86: Chapitre 3 structures séquentielles

86

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

Définition de la structure :

TYPE prog = STRUCTURE

prio : ENTIER

PSW : typeqcq

FIN

TYPE File_Attente = STRUCTURE

Elements : TABLEAU[Max] de prog

Queue : ENTIER

FIN

(3,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

Page 87: Chapitre 3 structures séquentielles

87

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

Modèle Implémentation

Initfile(F) F.Queue ←-1

Filevide(F) Retourner (F.Queue = -1)

Filepleine(F) Retourner (F.Queue = Max-1)

Defiler(F,X) SI (NON Filevide(F))

X ← F.Elements[0]

POUR I ← 0 à F.Queue - 1

F.Elements[I] ← F.Elements[I+1]

F.Queue ← F.Queue – 1

Page 88: Chapitre 3 structures séquentielles

88

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

(3,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

� Enfiler (F, (2, PSW))

(3,PSW)

(2,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

Page 89: Chapitre 3 structures séquentielles

89

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

� Enfilement:

� 1ère méthode: rechercher la bonne position (soit i), décaler les

éléments (i à Queue) vers la droite, insérer le nouvel élément

et enfin incrémenter la queue.

� 2ème méthode: faire un décalage à droite en commençant par la

queue jusqu’à trouver la bonne position du nouvel élément,

insérer le nouvel élément et enfin incrémenter la queue.

� 3ème méthode: incrémenter la queue, insérer le nouvel élément

à la queue ensuite essayer de trier le tableau en faisant des

permutations (principe de tri par insertion),

Page 90: Chapitre 3 structures séquentielles

90

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

1ère méthode: Enfiler(F,X)

SI (NON Filepleine(F))I ← 0 //rechercher la bonne position où enfiler X

TQ (I <F.Queue) & (F.Elements[I].priorité ≥ X.priorité ) faireI←I+1

//décaler les programmes moins prioritaires

J � F.QueueTQ (J≥I) faire

F.Elements[J+1] ← F.Elements[J] J�J-1

//insérer le programme X

F.Elements[I] ← X//mettre à jour la queue

F.Queue ← F.Queue + 1

Page 91: Chapitre 3 structures séquentielles

91

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

2ère méthode: Enfiler(F,X)

SI (NON Filepleine(F))I ← F.Queue//décaler les programmes moins prioritaires jusqu’à

trouver la bonne position où enfiler X

TQ (I ≥0) & (F.Elements[I].priorité < X.priorité ) faireF.Elements[I+1] ← F.Elements[I] I←I-1

//insérer le programme X

F.Elements[I] ← X//mettre à jour la queue

F.Queue ← F.Queue + 1

Page 92: Chapitre 3 structures séquentielles

92

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

3ème méthode: Enfiler(F,X)

SI (NON Filepleine(F))//mettre à jour la queue

F.Queue ← F.Queue + 1//insérer le programme X

F.Elements[F.Queue] ← X//trier le tableau d’éléments

I ← F.Queue -1TQ (I ≥0) & (F.Elements[I].priorité > F.Elements[I+1].priorité ) faire

Tmp �F.Elements[I] F.Elements[I+1] ← F.Elements[I] F.Elements[I] ← Tmp I←I-1

Page 93: Chapitre 3 structures séquentielles

93

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

Définition de la structure :

TYPE prog = STRUCTURE

prio : ENTIER

PSW : typeqcq

FIN

TYPE File_Attente = STRUCTURE

Elements : TABLEAU[Max] de prog

Queue, Tete : ENTIER

FIN

(3,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

TeteQueue

Page 94: Chapitre 3 structures séquentielles

94

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

Modèle Implémentation

Initfile(F) F.Tête ←Max; F.Queue ←Max

Filevide(F) Retourner (F.Tête = F.Queue)

Filepleine(F) Retourner (F.Tête = ( (F.Queue +1) Mod Max ))

Defiler(F,X) SI ‘(NON Filevide(F))

F.Tete ← (F.Tete + 1)Mod Max

X← F.elements[F.Tete]

Page 95: Chapitre 3 structures séquentielles

95

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

(3,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

� Enfiler (F, (2, PSW))

(3,PSW)

(2,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

Tete

Tete

Page 96: Chapitre 3 structures séquentielles

96

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

(1,PSW)

(0,PSW)

(3,PSW)

(2,PSW)

(1,PSW)

Queue

� Enfiler (F, (2, PSW))

Tete

(1,PSW)

(1,PSW)

(0,PSW)

(3,PSW)

(2,PSW)

(2,PSW)

Queue Tete

Page 97: Chapitre 3 structures séquentielles

97

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

� Enfilement:

� 1ère méthode: rechercher la bonne position (soit i), décaler les

éléments (i à Queue) vers la droite, insérer le nouvel élément

et enfin incrémenter la queue � décalage circulaire.

� 2ème méthode: faire un décalage à droite en commençant par la

queue jusqu’à trouver la bonne position du nouvel élément,

insérer le nouvel élément et enfin incrémenter la queue. �

décalage circulaire.

Page 98: Chapitre 3 structures séquentielles

98

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

� Enfilement:

� 3ème méthode: insérer le nouvel élément à la queue ensuite

essayer de trier le tableau en faisant des permutations

(principe de tri par insertion)

(1,PSW)

(0,PSW)

(2,PSW)

(3,PSW)

(2,PSW)

(1,PSW)

Queue Tete

(1,PSW)

(1,PSW)

(0,PSW)

(3,PSW)

(2,PSW)

(2,PSW)

Queue Tete

Page 99: Chapitre 3 structures séquentielles

99

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

3ème Méthode: Enfiler(F,X)

SI (NON Filepleine(F))//mettre à jour la queue

F.Queue ← (F.Queue + 1) mod Max//insérer le programme X

F.Elements[F.Queue] ← X//trier le tableau d’éléments

I ← F.QueueSi I=0 alors J����Max-1; Sinon J����I-1TQ (I ≠F.Tete) & (F.Elements[I].priorité > F.Elements[J].priorité ) faire

Tmp �F.Elements[I] F.Elements[I] ← F.Elements[J] F.Elements[J] ← TmpSi I=0 alors I����Max-1; Sinon I����I-1Si J=0 alors J����Max-1; Sinon J����J-1

Page 100: Chapitre 3 structures séquentielles

100

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

� Enfilement:

� 3ème méthode: insérer le nouvel élément à la queue ensuite

essayer de trier le tableau en faisant des permutations

(principe de tri par insertion)� Décrémentation des indices!!

� 4ème méthode: insérer le nouvel élément à la tête ensuite

essayer de trier le tableau en faisant des permutations

(principe de tri par insertion)

Page 101: Chapitre 3 structures séquentielles

101

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

(2,PSW)

(3,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

� Enfiler (F, (2, PSW))

(3,PSW)

(2,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

Tete

Tete

Page 102: Chapitre 3 structures séquentielles

102

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

(2,PSW)

(3,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

� Enfiler (F, (2, PSW))

(3,PSW)

(2,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

Queue

Tete

Tete

Page 103: Chapitre 3 structures séquentielles

103

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

(3,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

(2,PSW)

Queue

� Enfiler (F, (2, PSW))

(2,PSW)

(2,PSW)

(1,PSW)

(1,PSW)

(0,PSW)

(3,PSW)

Queue

Tete

Tete

Page 104: Chapitre 3 structures séquentielles

104

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

(1,PSW)

(0,PSW)

(2,PSW)

(3,PSW)

(2,PSW)

(1,PSW)

Queue

� Enfiler (F, (2, PSW))

Tete

(1,PSW)

(0,PSW)

(3,PSW)

(2,PSW)

(2,PSW)

(1,PSW)

Queue Tete

Page 105: Chapitre 3 structures séquentielles

105

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE

4ème Méthode: Enfiler (F, X)

SI (NON Filepleine(F))//insérer le programme X

F.Elements[F.Tete] ← X//trier le tableau d’éléments

I ← F..TeteJ����(I+1)mod Max;TQ (I ≠F.TQueue) & (F.Elements[I].priorité > F.Elements[J].priorité ) faire

Tmp �F.Elements[I] F.Elements[I] ← F.Elements[J] F.Elements[J] ← Tmp I����(I+1)mod Max;J����(J+1)mod Max;

//mettre à jour la Tête

Si F.Tete=0 alors F.Tete����Max-1; Sinon F.Tete����I-1

Page 106: Chapitre 3 structures séquentielles

106

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION DYNAMIQUE

(3,PSW)

Tête Queue

(2,PSW) (1,PSW) (1,PSW) (0,PSW)

Définition de la structure :

TYPE prog = STRUCTURE

prio : ENTIER

PSW : typeqcq

FIN

TYPE Maillon = STRUCTURE

val : prog

suiv: * Maillon

FIN

TYPE File_Attente = STRUCTURE

TêTe, Queue : *Maillon

FIN

Page 107: Chapitre 3 structures séquentielles

107

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION DYNAMIQUE

Modèle Implémentation

Initfile(F) F.Tete ← NIL

F.Queue← NIL

Filevide(F) Retourner (F.Tete = NIL )

Defiler(F,X) SI (NON Filevide(F))

P ← F.Tete

X ← Valeur(F.Tete)

F.Tete ← Suivant(F.Tete)

Liberer(P)

Page 108: Chapitre 3 structures séquentielles

108

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION DYNAMIQUE

� Enfiler (F, (2, PSW))

(3,PSW)

Tête Queue

(2,PSW) (1,PSW) (1,PSW) (0,PSW)

(2,PSW)

(3,PSW)

Tête Queue

(2,PSW) (1,PSW) (1,PSW) (0,PSW)

Page 109: Chapitre 3 structures séquentielles

109

FILE D’ATTENTE AVEC PRIORITÉ

IMPLÉMENTATION DYNAMIQUEEnfiler(F,X)

Allouer (P), Aff_Val(P, X), aff_suiv(P, NIL)

Si (Filevide(F)) F.Tete ← P; F.Queue ← P

Sinon

Si (X.prio >Valeur(F.Tete).prio) alors //insertion au début

aff_suiv(P, F.Tete); F.Tete←P

Sinon

S←L

TQ (suivant (S)≠Nil) et (valeur (suivant (S))≥X.prio) faire

S← suivant (S)

Si (suivant (S) = Nil) alors //insertion à la fin

aff_suiv (S, P); F.Queue ← P

Sinon //insertion au milieu

aff_suiv(P, suivant (S)), aff_suiv(S, P)

Page 110: Chapitre 3 structures séquentielles

PARTIE III:

PILES

Page 111: Chapitre 3 structures séquentielles

PLAN DE LA PARTIE III

� Définition

� Modèle

� Implémentation

� Représentation statique

� Représentation dynamique

� Utilisation

111

Page 112: Chapitre 3 structures séquentielles

112

� Une pile (en anglais stack) est une structure de données

fondée sur le principe « dernier arrivé, premier sorti » (ou

LIFO: Last In, First Out)

� Les derniers éléments ajoutés à la pile seront les premiers à être

récupérés.

DÉFINITION

� Le fonctionnement ressemble à une piles

des livres: On ajoute des livres sur la pile,

et on les récupère dans l'ordre inverse, en

commençant par le dernier ajouté.

Page 113: Chapitre 3 structures séquentielles

113

� Une pile peut être définie comme une collection

d'éléments dans laquelle tout nouvel élément est inséré à

la fin (empilement) et tout élément ne peut être

supprimé que de la fin (dépilement).

� Les insertions et les suppressions d’éléments se font à une seule

et même extrémité de la liste appelée le sommet de la pile.

DÉFINITION

12

7

18

3Sommet

DépilementEmpilement

Page 114: Chapitre 3 structures séquentielles

114

� Les opérations habituelles sur les piles sont :

� Initialisation de la pile

� Vérification du contenu de la pile (vide ou pleine)

� Empilement : ajout d’un élément au sommet de la pile

� Dépilement : retrait d’un élément du sommet de la pile

MODÈLE

Opération Rôle

InitPile(P) créer une pile vide

Empiler(P,Val) ajouter Val en sommet de pile

Dépiler(P,Val) retirer dans Val l'élément en sommet de pile

Pilevide(P) tester si la pile est vide

Pilepleine(P) tester si la pile est pleine

Page 115: Chapitre 3 structures séquentielles

115

� Les piles peuvent être présentées en deux manières:

� statique en utilisant les tableaux,

� dynamique en utilisant les listes linéaires

chaînées.

IMPLÉMENTATION

Page 116: Chapitre 3 structures séquentielles

116

� L’implémentation statique des piles utilise les tableaux.

Dans ce cas, la capacité de la pile est limitée par la taille

du tableau (max). L’ajout à la pile se fait dans le sens

croissant des indices, tandis que le retrait se fait dans le

ses inverse.

IMPLÉMENTATION STATIQUE

Sommet =5 V5

V4

V3

V2

V1

V0

DépilementEmpilement

0

max-1

Page 117: Chapitre 3 structures séquentielles

117

IMPLÉMENTATION STATIQUE PAR DÉCALAGE

Définition de la structure :

TYPE Pile= STRUCTURE

Elements : TABLEAU[Max] de Typeqq

Sommet : ENTIER

FIN

VAR P : Pile

Pile

Eléments

Sommet =5 V5

V4

V3

V2

V1

V0 0

max-1

Page 118: Chapitre 3 structures séquentielles

118

IMPLÉMENTATION STATIQUE

modèle Implémentation

Initpile(P) P.Sommet ← -1

Pilevide(P) Retourner ( P.Sommet = -1)

Pilepleine(P) Retourrner (P.Sommet = Max-1)

Empiler(P, X) SI NON Pilepleine(P)

P.Sommet ← P.Sommet + 1

P.Elements[P.Sommet] ← X

Sinon « Overflow »

Depiler(P, X) Si NON Pilevide(P)

X ← P.Elements [P.Sommet]

P.Sommet ← P.Sommet – 1

Sinon « Underflow »

Page 119: Chapitre 3 structures séquentielles

119

� L’implémentation dynamique utilise les listes linéaires

chinées. Dans ce cas, la pile peut être vide, mais ne peut être

jamais pleine, sauf bien sur en cas d’insuffisance de l’espace

mémoire. L’empilement et le dépilement dans les piles

dynamique se font à la tête de la liste.

� Les opérations de base sont :

� Enfilement : insertion d’un élément à la tête de la LLC

� Défilement : suppression d’un élément de la tête de la LLC

� Vérification si la LLC n’est pas vide

IMPLÉMENTATION DYNAMIQUE

V4 V3 V2 V1 V0

Sommet (Tête)Empilement

Dépilement

Page 120: Chapitre 3 structures séquentielles

120

IMPLÉMENTATION DYNAMIQUE

V4 V3 V2 V0 V1

Sommet

Définition de la structure :

TYPE Maillon = STRUCTURE

val : typeqq

suiv: * Maillon

FIN

VAR sommet: *Maillon

Pile

Page 121: Chapitre 3 structures séquentielles

121

IMPLÉMENTATION DYNAMIQUE

Modèle Implémentation

Initpile(Sommet) Sommet ← Nil

Pilevide(Sommet) Retourner (Sommet = Nil)

Empiler(Sommet, X) Allouer (Q)

Aff_Val(Q, X)

aff_suiv(Q, Sommet)

Sommet ← Q

Depiler(Sommet, X) Si NON Pilevide(Sommet)

X ← Valeur(Sommet)

Q ← Sommet

Sommet ←Suivant(Sommet)

Liberer(Q)

Fsi

Page 122: Chapitre 3 structures séquentielles

122

� Analyse syntaxique : qui est une phase de la

compilation qui nécessite une pile.

� Par exemple, le problème de la reconnaissance des mots entreparenthèses:

� accepter les mots comme (), ()(()) ou ((()())()) ;

� rejeter les mots comme )(, ()(() ou ((()()))).

� Pour le résoudre, on stocke les parenthèses ouvrantes non encorerefermées dans une pile de caractères. Autrement dit, on lit caractèrepar caractère, s’il s’agit d’une parenthèse :

� ouvrante, elle est empilée ;

� fermante, la parenthèse ouvrante correspondante est dépilée.

� Le mot est accepté si la pile est vide lorsque le mot a été lu.

UTILISATION

Page 123: Chapitre 3 structures séquentielles

123

� Calcul arithmétique : Une application courante des

piles se fait dans le calcul arithmétique: l'ordre dans la

pile permet d'éviter l'usage des parenthèses.

� Exercice 9 (Evaluation d’expression arithmétique postfixée):

� Une expression arithmétique est une combinaison des opérandes (les

nombres), des opérateurs [+, -, * ; /, %] et des parenthèses [(, )]. Elle

est habituellement écrite de manière infixée, c'est à dire que

l'opérateur est placé entre ses deux opérandes. On trouve aussi une

notation postfixée où l'opérateur est placé après ses opérandes.

L'intérêt de cette notation est qu'il n'y a plus besoin de connaître les

priorités des opérateurs, et donc plus besoin de parenthèses.

UTILISATION

Page 124: Chapitre 3 structures séquentielles

124

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

� Il est demandé de réaliser une calculette qui prend en entrée une

LLC représentant une expression arithmétique en notation infixée, et

qui affiche le résultat de l'évaluation de cette expression, en utilisant

une pile statique.

1. Ecrire les expressions suivantes en postfixée:

5*(((9+8)*(4*6))+7), ~3+2-5*6/2+3, (1+3*4+2)*5

Notation Format Exemples

Infixée <expG> <op> <expD> a + b, a + b * c, (a+b) * c, -a + b

Postfixée <expG> <expD> <op> a b +, a bc* +, ab+ c *, a- b +

Page 125: Chapitre 3 structures séquentielles

125

1. Ecrire les expressions suivantes en postfixée:

2. Une expression arithmétique peut être implémentée

sous forme d’une LLC où les maillons sont déclarés

comme suit:

Expressions en infixée Expressions en postfixée

5 *(((9+8)*(4*6))+7) 5 98*46**7+*

~3+2-5*6/2+3 3~2+56*2/-3+

(1+3*4+2)*5 134*+2+5*

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 126: Chapitre 3 structures séquentielles

1262. Donner la LLC qui présente cette expression

5 * (((9+8)*(4*6))+7) en format infixé et postfixé.

Type Terme = structure

Op : Chaines de caractères;

Prio : {0,1, 2, 3, 4};

Fin

Type maillon = structure

Val : Terme;

Suiv : * maillon ;

Fin

Prio Signification

0 Opérande

1 Opérateur binaire (+, -)

2 Opérateur binaire ( *, /, %)

3 Opérateur unaire ( - unaire)

4 Parenthèse ouvrante ou fermante

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 127: Chapitre 3 structures séquentielles

127

[‘5’, 0] [‘*’, 2] [‘(’, 4] [‘(’, 4] [‘(’, 4]

[‘9’, 0][‘+’, 2][‘8’, 0][‘)’, 4]

[‘(’, 4] [‘4’, 0] [‘*’, 2] [‘6’, 0]

[‘)’, 4][‘)’, 4][‘+’, 2][‘)’, 4]

[‘*’, 2]

Linfixe

� La LLC qui présente cette expression

5*(((9+8)*(4*6))+7).

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

[‘7’, 0]

Page 128: Chapitre 3 structures séquentielles

128

[‘5’, 0] [‘9’, 0] [‘8’, 0] [‘*’, 2] [‘4’, 0]

[‘6’, 0][‘*’, 2][‘*’, 2][‘7’, 0]

[‘*’, 2]

[‘+’, 1]

Lpostfixe

� La LLC qui présente cette expression 598*46**7+*

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 129: Chapitre 3 structures séquentielles

129

3. Ecrire l’algorithme qui permet de transformer une

expression infixée en une expression postfixée.

� Exemples illustratif:

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Expressions en infixée Expressions en postfixée

5 *(((9+8)*(4*6))+7) 5 98+46**7+*

~3+2-5*6/2+3 3~2+56*2/-3+

(1+3*4+2)*5 134*+2+5*

Page 130: Chapitre 3 structures séquentielles

130

1. Inserer ([5, 0])

2. Empiler ([*, 2])

3. Empiler ([(, 4])

4. Empiler ([(, 4])

5. Empiler ([(, 4])

6. Inserer ([9, 0])

7. Empiler ([+, 1])

8. Inserer ([8, 0])

9. Depiler ([+, 1]); inserer ([+, 1]); Depiler ([(, 4])

10. Empiler ([*, 2])

11. Empiler ([(, 4])

[*, 2][(, 4]

2 - 5

[(, 4][(, 4]

7

[*, 2][(, 4][(, 4][(, 4][+, 1]

� Exemple 1: 5 * (((9+8)*(4*6))+7) � 598+

10 - 11

[*, 2][(, 4][(, 4][*, 2][(, 4]

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 131: Chapitre 3 structures séquentielles

131

12. Inserer ([4, 0])

13. Empiler ([*, 2])

14. Inserer ([6, 0])

15. Depiler ([*, 2]); inserer ([*, 2]); Depiler ([(, 4])

16. Depiler ([*, 2]); inserer ([*, 2]); Depiler ([(, 4])

17. Empiler ([+, 1]);

18. Inserer ([7, 0])

19. Depiler ([+, 1]); inserer ([+, 1]); Depiler ([(, 4])

20. Depiler ([*, 2]); inserer ([*, 2]);

13

[*, 2][(, 4][(, 4][*, 2][(, 4][*, 2]

[(, 4]

15 - 16

[*, 2]

[(, 4][*, 2][(, 4][*, 2]

� Exemple 1: 5 * (((9+8)*(4*6))+7) � 598+46**7+*

17 - 20

[*, 2][(, 4][+, 1]

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 132: Chapitre 3 structures séquentielles

132

1. Empiler ([~, 3])2. Inserer ([3, 0])3. Depiler ([~, 3]); inserer ([~, 3]); Empiler ([+, 1])4. Inserer ([2, 0])5. Depiler ([+, 1]); insérer ([+, 1]), Empiler ([-, 1])6. Inserer ([5, 0])7. Empiler ([*, 2]8. Inserer ([6, 0])9. Depiler ([*, 2]); inserer ([*, 2]); Empiler ([/, 2])10. Inserer ([2, 0])11. Depiler ([/, 2]); inserer ([/, 2]); Depiler ([-, 1]); inserer ([-, 1]);

Empiler ([+, 1])12. Inserer ([3, 0])13. Depiler ([+, 1]); inserer ([+, 1]);

[~, 3]

1

[-, 1]

5

[+, 1]

3

[-, 1]

7

[*, 2]

� Exemple 2: ~3+2-5*6/2+3�3~2+56*2/-3+

[-, 1]

9

[/, 2]

[+, 1]

11

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 133: Chapitre 3 structures séquentielles

133

1. Empiler ([(, 4])2. Inserer ([1, 0])3. Empiler ([+, 1])4. Inserer ([3, 0])5. Empiler ([*, 2])6. Inserer ([4, 0])7. Depiler ([*, 2]); inserer ([*, 2]); Depiler ([+, 1]); insérer ([+, 1]),

Empiler ([+, 1])8. Inserer ([2, 0])9. Depiler ([+, 1]); inserer ([+, 1]); Depiler ([(, 4])10. Empiler ([*, 2])11. Inserer ([5, 0])12. Depiler ([*, 2]); inserer ([*, 2]);

[(, 4]

1 [(, 4]

3

[+, 1]

[(, 4]

5

[+, 1][*, 2]

[(, 4]

7

[+, 1]

� Exemple 3: (1+3*4+2)*5 �134*+2+5*

[*, 2]

10

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 134: Chapitre 3 structures séquentielles

134

� Transformation infixée ���� postfixée (Pseudo Algorithme):

Lire l’expression infixée terme par terme:

Si c'est un opérande alors on insère dans la liste Lpostfixée

Si c’est une parenthèse ouvrante alors on doit l’empiler tout le

temps.

Si c’est une parenthèse fermante alors on doit dépiler jusqu'à

trouver la parenthèse ouvrante associée. Les éléments dépilés sont

insérés dans la liste Lpostfixée

Si c'est un opérateur,

Si la pile est vide ou si l'opérateur est plus prioritaire que

l'opérateur en sommet de pile, alors on l'empile.

Sinon, on dépile jusqu'à pouvoir l'empiler. Les éléments dépilés

sont insérés dans la liste Lpostfixée

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 135: Chapitre 3 structures séquentielles

135

� Transformation infixée ���� postfixée (Déclaration):

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Type Terme = structure

Op : Chaines de caractères;

Prio : {0,1, 2, 3, 4};

Fin

Type Maillon = structure

Val : Terme;

Suiv : *Maillon ;

Fin

Type Pile= structure

Elements : tableau[Max] de Terme

Sommet : entier

Fin

Prio Signification

0 Opérande

1 Opérateur binaire (+, -)

2 Opérateur binaire ( *, /, %)

3 Opérateur unaire ( - unaire)

4 Parenthèse ouvrante ou fermante

Page 136: Chapitre 3 structures séquentielles

136

� Transformation infixée ���� postfixée (Algorithme):

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

InfixeAPostfixe( Linfixe: *Maillon) : *MaillonVar P: Pile; Lpostfixe, Q:*Maillon; X, Y: TermeDebut

Lpostfixe �Nil; Q�Linfixe; InitPile(P)Tant que (Q≠Nil) faire

X �valeur (Q);Si X.prio = 0 alors InsererLLCFin (Lpostfixe, X) FSISi X.op ='(‘ alors Empiler(P, X) FSISi X.op = ‘)’ alors // depiler (et ecrire ...) jusqu'a l'ouvranteTant que P.Elements[P.Sommet]≠ ‘(‘ faire

depiler(P, Y); InsererLLCFin (Lpostfixe, Y)FTQdepiler(P,Y) // et depiler l'ouvrante !FSI

Page 137: Chapitre 3 structures séquentielles

137

� Transformation infixée ���� postfixée (Algorithme):

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Si X.prio = 1 , 2 ou 3 alors //c’est un operateurTant que (non Pilevide(P)) et (P.Elements[P.Sommet]≠ ‘(‘ ) et (P.Elements[P.Sommet].prio ≤X.prio) faire

depiler(P,Y)InsererLLCFin (Lpostfixe, Y)

FTQEmpiler(T[i].valeur,P)

FSIQ�suivant (Q);

FTQ// maintenant vider la pileTant que non Pilevide(P) faire

depiler(P,Y)InsererLLCFin (Lpostfixe, Y)

FTQRetourner (Lpostfixe)

Fin

Page 138: Chapitre 3 structures séquentielles

138

3. Donner l’algorithme d’évaluation d’une expression

postfixée.

� Exemples illustratif:

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Expressions en

infixée

Expressions en

postfixée

Evaluation

5 *(((9+8)*(4*6))+7) 5 98*46**7+* 2075

~3+2-5*6/2+3 3~2+56*2/-3+ -13

(1+3*4+2)*5 134*+2+5* 75

Page 139: Chapitre 3 structures séquentielles

139

1. empiler(5)

2. empiler(9)

3. empiler(8)

4. depiler (8); depiler (9); empiler(9 + 8)

5. empiler(4)

6. empiler(6)

7. depiler (6); depiler (4); empiler(4*6)

8. depiler (24); depiler (17); empiler( 17 * 24 )

9. empiler(7)

10. depiler (7); depiler (408); empiler(408+7)

11. depiler (415); depiler (5); empiler( 5*415)

12. depiler(2075)5

415

« 10 »

2075

« 11 »

54087

« 9 »

5408

« 8 »

5174

« 5 »5

1746

« 6 »5

1724

« 7 »

5

« 1 »

59

« 2 »

598

« 3 »5

17

« 4 »

� Exemple 1: 598+46**7+* = 2075

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 140: Chapitre 3 structures séquentielles

140

1. empiler(3)2. depiler(3) ; empiler(0-3)3. empiler(2)4. depiler (2); depiler (-3); empiler( -3 + 2)5. empiler(5)6. empiler(6)7. depiler (6); depiler (5); empiler(5*6)8. empiler(2)9. depiler (2); depiler (30); empiler(30/2)10. depiler (15); depiler (-1); empiler(-1-15)11. empiler (3)12. depiler (3); depiler (-16); empiler(-16+3)13. depiler (-13)

-130

« 7 »

-1302

« 8 »

3« 1 »

-3« 2 »

-32

« 3 »

56

-1

« 4-6 »

-115

« 9 »

3-16

« 10 »

-13« 12 »

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

� Exemple 2: 3~2+56*2/-3+ = -13

Page 141: Chapitre 3 structures séquentielles

141

1. empiler(1)

2. empiler(3)

3. empiler(4)

4. depiler (4); depiler (3); empiler( 3 * 4)

5. depiler (12); depiler (1); empiler(1+12)

6. empiler(2)

7. depiler (2); depiler (13); empiler(13+2)

8. empiler(5)

9. depiler (5); depiler (15); empiler(15*5)

10. depiler (75)

5

13

« 5 »

132

« 6 »

1« 1 »

13

« 2 »

112

« 4 »

15« 7-8 »

75« 9 »

« 3 »134

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

� Exemple 3: 134*+2+5* = 75

Page 142: Chapitre 3 structures séquentielles

142

� Evaluation d'une expression postfixée (Pseudo Algorithme)

Lire l’expression postfixée terme par terme:

Si c’est un opérande alors on l’empile

Si c’est un opérateur alors

Si c’est un opérateur unaire (moins unaire) alors on dépile

une fois, on multiple par (-1) ensuite on empile le résultat

Si c’est opérateur binaire alors on dépile deux fois, on fait le

calcul correspondant, ensuite on empile le résultat.

A la fin : Le résultat final se trouve au sommet de pile

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Page 143: Chapitre 3 structures séquentielles

143

� Evaluation d'une expression postfixée (Déclaration)

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Type Terme = structure

Op : Chaines de caractères;

Prio : {0,1, 2, 3, 4};

Fin

Type Maillon = structure

Val : Terme;

Suiv : *Maillon ;

Fin

Type Pile1= structure

Elements : tableau[Max] de chaines de caractères

Sommet : entier

Fin

Prio Signification

0 Opérande

1 Opérateur binaire (+, -)

2 Opérateur binaire ( *, /, %)

3 Opérateur unaire ( - unaire)

4 Parenthèse ouvrante ou fermante

Page 144: Chapitre 3 structures séquentielles

144

� Evaluation d'une expression postfixée (Fonction Calcul)

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

Procédure Calcul (op : caractère, op1, op2, res : chaines de caractères)Var X, Y, Z : entierDebut// convertir les opérandes en entier

X �ConvertirChaineEntier(op1) ;Y �ConvertirChaineEntier(op2) ;//réaliser l’opération correspondante

Selon opCas ‘+’: Z�X+YCas ‘-’: Z�X-YCas ‘*’: Z�X*YCas ‘/’: Z�X/YCas ‘%’: Z�X%YFinselon//convertir le résultat en chaîne de caractère

Res �ConvertirEntierChaine(Z)Fin

Page 145: Chapitre 3 structures séquentielles

� Evaluation d'une expression postfixée (Algorithme)

EXERCICE 9 (EVALUATION D’EXPRESSION ARITHMÉTIQUE POSTFIXÉE)

EVAL_Postfixe( L: *Maillon) : entierInitpile(P); Q�LpostfixeTant que (Q≠Nil) faire

X�valeur (Q)Si (X.prio=0) alors Empiler( P, X.op) //opérandeSinon /* donc c'est un opérateur */

Si (X.prio=3) // moins unaireDepiler(P,Y); Calcul(‘*’,‘-1’, Y, Y); Empiler(P, Y)

SinonSi (X.prio=1) ou (X.prio=2) alors /* donc opérateur binaire */

Depiler(P,b); Depiler(P,a); Calcul(X.op, a, b, a); Empiler( P, a)

Q�suivant (Q)FTQDepiler( P, res ) // le résultat se trouve au sommetRetourner (ConvertirChaineEntier (res))

� Evaluation d'une expression postfixée (Algorithme)

145

Page 146: Chapitre 3 structures séquentielles

SOURCES DE CE COURS

� N. EL-ALLIA , Cours d’Algorithmique et Structures de données

dynamiques, Ecole nationale Supérieure d’Informatique (ESI), 2010.

� Djamel Eddine ZEGOUR, Cours de Structures de Données, Ecole nationale

Supérieure d’Informatique (ESI), Disponible sur

http://zegour.esi.dz/Cours/Cours_sdd.htm

� B. Boutoumi, , Cours d’Algorithmique et Structures de données, Université

Saad Dahlab de Blida, 2014, Disponible sur

https://sites.google.com/a/esi.dz/s-aroussi/algorithmique-et-structure-de-

donnees/nouveau-programme .

� A. Djeffal, Cours d’Algorithmique et Structures de données 1, Université

Mohamed Khider de Biskra, 2012, Disponible sur univ-

biskra.dz/fac/fsesnv/cours/algo 146