Vous êtes sur la page 1sur 72

Les piles et les files

Pile
 Quand vous faites la vaisselle, les assiettes sont empilées les
unes sur les autres. Quand vous lavez les assiettes, vous prenez
celles au sommet en descendant au fur et à mesure
 Si des nouvelles assiettes sont rajoutées, elles le sont au sommet
de la pile
Sommet

 La pile est une structure de données qui fonctionne


exactement comme une pile d’assiettes : on peut ajouter et
supprimer des éléments homogènes (de même type) suivant la
règle du dernier arrivé premier sorti (Last In First Out ou LIFO)
2 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Pile
 Comme les autres structures de données, les éléments d’une
pile peuvent être simples (entiers, réels, …) ou complexes
 Dans une pile, le seule élément accessible directement est le
dernier élément ajouté (qui est appelé le sommet)
 Sommet de la pile : dernier élément inséré dans la pile
 Quand un nouvel élément est inséré dans une pile, il est placé
par-dessus de l’ancien sommet, et il devient lui-même le
nouveau sommet. Cette opération est appelée l’empilement
 L’opération inverse, consistant à supprimer un élément, est
appelée le dépilement
 L’empilement et le dépilement ne sont opérables que
surMohamed
l’élément au sommet de la pile
Aymen CHARRADA - ISET El KEF - Info1
3 24/05/2023
Pile
 Exemple
 Evolution d’une pile d’entiers dans laquelle on ajoute successivement
les valeurs 6, 3 et 16, puis on supprime la valeur 16, puis on ajoute la
valeur 87

Dépiler la
Pile vide Empiler la valeur 16
valeur 3

Empiler la Empiler la Empiler la


valeur 6 valeur 16 valeur 87
4 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Pile
 Les piles sont notamment utilisées :
 Dans les systèmes d’exploitation, pour gérer l’espace mémoire associé
aux différents appels de fonction faits au sein d’un programme
 Dans les compilateurs ou analyseurs syntaxiques, pour analyser et
évaluer les expressions arithmétiques parenthésées
 En intelligence artificielle, dans les algorithmes d’exploration d’arbres,
pour effectuer par exemple un parcours en profondeur
…

5 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile
 Les piles représentent une notion abstraite (une spécification de
structure de données) et nécessitent d’être implémenter à
travers des structures de données réelles pour être concrétiser
 Une pile peut être implémentée par un tableau (appelée pile
statique) ou par une liste chaînée (appelée pile dynamique)
 Les piles admettent des opérations de base (appelées aussi
primitives de gestion des piles) qui permettent de faciliter la
manipulation des piles
 Ces opérations sont implémentées généralement sous forme de
sous-programmes (fonctions et procédures)

6 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile
 Les primitives de gestion des piles sont les suivantes :
 creerPile : cette fonction crée et retourne une pile vide
 estVidePile : cette fonction renvoie vrai si la pile est vide, faux sinon
 estPleinePile : cette fonction renvoie vrai si la pile est pleine, faux
sinon. Cette fonction est applicable uniquement sur les piles statiques
 sommet : cette fonction permet l’accès à l’information contenue dans
le sommet de la pile
 empiler : cette fonction permet d’ajouter un élément au sommet de la
pile. La fonction renvoie un code d’erreur en cas de manque de
mémoire
 depiler : cette fonction supprime le sommet de la pile
 viderPile : cette fonction vide la pile

7 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile
 Le principe de gestion des piles est que, lorsqu’on utilise une
pile, on ne se préoccupe pas de la manière dont elle a été
implémentée (tableau ou liste chainée), mais on utilise
uniquement les primitives qui sont toujours les mêmes

 Dans ce qui suit, on fera l’hypothèse qu’on va manipuler des


piles d’entiers. Cependant, on pourrait utiliser n’importe quel
autre type, y compris les types complexes

8 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Les piles statiques sont implémentées en utilisant les tableaux
 Un tableau admet toujours une taille maximale à ne pas
dépasser, donc il faut connaître en permanence la taille de la
pile, c’est à dire combien de cases du tableau sont occupées par
des éléments de la pile pour ne pas dépasser la taille limite
 Pour modéliser une pile, on utilise un type structuré incluant à
la fois le tableau qui représente la pile et l’entier qui représente
sa taille
« T_MAX » : est une
Type
constante qui indique la taille
Structure Pile
maximale du tableau et qui
taille : entier représente aussi le nombre
contenu : tableau [1..T_MAX] d’entiers maximale des éléments de la
Fin Structure pile
9 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Pile statique
 Exemple
Pile

T_MAX est bien sûr la taille maximale de la pile

10 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Dans notre implémentation, on a le choix entre deux
possibilités pour manipuler une pile statique :
 Soit on considère que le sommet est au début du tableau (à gauche) :

 Soit on considère qu’il est à la fin de la partie du tableau occupée par la


pile (à droite) :

 A votre avis, quel est le meilleur choix dans ce cas ?

11 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Quand on insère ou on supprime un élément dans une pile, on
travaille toujours sur le sommet. La première solution (sommet
au début du tableau) implique donc de décaler l’intégralité des
valeurs de la pile à chaque empilement ou dépilement
 Au contraire, la deuxième solution (sommet au dernier
élément non vide du tableau) évite ce travail
→ Nous allons retenir alors la deuxième solution : Le sommet
de la pile est le dernier élément du tableau

12 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Création
 Comme on a dit dans le diapo. 8, la création d’une pile vide se fait
à travers la fonction « creerPile » :

Fonction creerPile ( ) : Pile


VAR
P : Pile
Début
P . taille  0
creerPile  P
FIN

13 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Vérification de la taille
 Cette vérification se fait à travers les deux fonctions :
 EstVidePile : cette fonction renvoie vrai si la pile est vide, faux sinon
 EstPleinePile : cette fonction renvoie vrai si la pile est pleine, faux sinon. Cette
fonction est applicable sur les piles statiques uniquement

Fonction estVideP (P:Pile) : booléen Fonction estPleineP (P:Pile) : booléen


VAR VAR
R : booléen R : booléen
Début Début
Si (P . taille = 0) alors Si (P . taille = T_MAX) alors
R  vrai R  vrai
sinon sinon
R  faux R  faux
fin si fin si
estVidePile  R estPleinePile  R
FIN FIN
14 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Pile statique
 Empilement (1/2)
 L’empilement se fait simplement en :
 Rajoutant un élément à la fin de notre représentation de la pile ;
 Mettant à jour la taille de la pile

15 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Empilement (2/2)
.
NB : l’argument « P » Fonction empiler (Var P:Pile, X:entier) : entier
est passée par adresse VAR
Err : entier
puisque la fonction
Début
« empiler » va changer Err  0
son contenu si (estPleinePile (P^) = vrai) alors
La variable « Err » Err  -1
représente le code sinon
d’erreur. Elle vaut « - P^.contenu[P^.taille + 1]  X
1 » si la pile est pleine P^.taille  P^.taille + 1
fin si
(impossible d’empiler) empiler  Err
et « 0 » si tout va bien FIN

16 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Dépilement (1/2)
 Le dépilement consiste à :
 Supprimer le dernier élément de notre représentation de la pile ;
 Mettre à jour la taille de la pile

17 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Dépilement (2/2)

Fonction depiler (Var P:Pile) : entier


NB : l’argument « P » est
VAR
passée par adresse puisque Err : entier
la fonction « depiler » va Début
changer son contenu Err  0
La variable « Err » si (estVidePile (P^) = vrai) alors
représente le code Err  -1
d’erreur. Elle vaut « -1 » si sinon
P^.taille  P^.taille - 1
la pile est vide et « 0 » si fin si
tout va bien depiler  Err
FIN

18 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Accès au sommet de la pile

Fonction sommet (P:Pile) : entier


VAR
S : entier
Début
si (estVidePile (P) = faux) alors
S  P.contenu [P.taille]
fin si
sommet  S
FIN

19 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile statique
 Vider la pile

Procédure viderPile (Var P:Pile)


Début
P^.taille  0
FIN

NB : l’argument « P » est passée par


adresse puisque la fonction « vider »
va changer son contenu

20 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile dynamique
 Les piles statiques possèdent les mêmes limites que les tableaux
 Les piles dynamiques sont conçues pour remédier à ces limites,
elles sont implémentées avec les listes chainées
 Avec une pile dynamique, on accède toujours à un seul bout de
la liste. Donc, on peut utiliser une liste simplement chaînée, car on
n’aura jamais besoin de parcourir la liste dans les deux sens
 La première chose à faire est de déclarer le type structuré qui
modélise une cellule Type
Structure Cellule
donnee : entier
suivant : ^Cellule
Fin Structure
21 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Pile dynamique
 La pile dynamique n’est qu’un pointeur sur « Cellule ». Donc,
on peut déclarer un type structuré qui définit les piles
dynamiques
Type Pile = ^Cellule

 Autrement dit : une pile dynamique est directement une liste


simplement chainée, le sommet de la pile est situé au début de
la liste chaînée

22 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile dynamique
 Création d’une pile vide
Fonction creerPile ( ) : Pile
Début
creerPile  Nil
FIN

 Vérification de la taille : Fonction estVidePile (P:Pile) : booléen


La fonction « estPleinePile » VAR
R : booléen
n’est plus logique vu qu’une Début
liste chainée n’a pas de taille Si (P = Nil) alors
R  vrai
limite (ne peut jamais être sinon
pleine) R  faux
fin si
estVidePile  R
FIN
23 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Pile dynamique
 Empilement
 L’empilement se fait en ajoutant un élément au début de la liste
Fonction empiler (Var P:Pile, X:entier) : entier
VAR
La fonction « empiler » se
Err : entier
Nv : ^Cellule charge d’abord de créer un
Début nouvel élément « Nv », ce
Err  0
allouer (Nv)
qui peut provoquer une
si (Nv = Nil) alors Err  -1 erreur si l’allocation
sinon dynamique rencontre un
Nv^.donnee  X
si (estVidePile (P^) = vrai) alors problème (par exemple,
Nv^.suivant  Nil s’il n’y a pas assez de
P^  Nv
mémoire libre)
sinon
Nv^.suivant  P^ On doit traiter les deux
P^  Nv cas: si la pile est vide ou
fin si
fin si
non
24 empiler
Mohamed Aymen  Err- ISET El KEF - Info1
CHARRADA 24/05/2023
FIN
Pile dynamique
 Dépilement
 Le dépilement est réalisé en supprimant le sommet de la pile, c'est-à-
dire le premier élément de la liste
Fonction depiler (var P:Pile) : entier
VAR
Err : entier
aux : ^Cellule Si la fonction « depiler »
Début rencontre une erreur (par
Err  0 exemple parce que la liste
si (estVidePile(P^) = vrai) alors Err  -1 est vide), alors elle
sinon
renverra « -1 »
aux  P^
P^  aux^.suivant
libérer (aux)
finsi
depiler  Err
FIN
25 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Pile dynamique
 Accès au sommet de la pile
 Pour accéder au sommet, il suffit d’avoir la valeur du premier élément
de la pile (de la liste chainée)

Fonction sommet (P:Pile) : entier


VAR
S : entier
Début
si (estVidePile (P) = faux) alors
S  P^.donnee
fin si
sommet  S
FIN

26 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Pile dynamique
 Vider la pile

Procédure viderPile (Var P:Pile)


Var
aux : ^Cellule
Début
tant que (estVidePile (P^) = Faux) faire
aux  P^
P^  aux^.suivant
libérer (aux)
fin tant que
FIN

27 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File
 Dans une file d’attente, dans un magasin, un cinéma, chez le
médecin …, le premier arrivé est le premier servi (First In First
Out ou FIFO)
 Lorsqu’un nouveau élément arrive, il va faire la queue à la fin
de la file. Lorsqu’on prend un élément, il s’agit du premier

Queue ou fin Début ou tête


28 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
File
 Une file est une structure de données qui fonctionne
exactement comme une file d’attente : on peut ajouter et
supprimer des éléments suivant la règle FIFO
 Une file peut être vue comme un tuyau : d’un côté, on peut
entrer des données et de l’autre coté on peut sortir des
données.
 Comme la pile, la file est homogène : tous ses éléments sont de
même type, qui peut être aussi bien simple que complexe

29 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File
 La seule donnée qui peut être enlevée de la file est la plus
ancienne, on l’appelle la tête :
 Tête de file : élément ayant été inséré depuis le plus longtemps
 Lors d’une insertion, le nouvel élément est placé après
l’élément le plus récent, qui s’appelle la fin de la file :
 Fin de file : élément ayant été inséré depuis le moins longtemps
 Dans une file, l’opération consistant à insérer un élément
s’appelle l’enfilement, alors que l’opération inverse consistant à
en retirer un est le défilement
 L’enfilement opère sur la fin de file et le défilement se fait sur la tête
de la file

30 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File
 Exemple
 Evolution d’une file d’entiers dans laquelle on insère 6, 3 et 16, puis on
supprime 6, on insère 87 et 55, on supprime 3 et 16.
File vide Défiler la
valeur 6
Enfiler la Enfiler la
valeur 6 valeur 87
Enfiler la Enfiler la
valeur 3 valeur 55
Enfiler la Défiler la
valeur 16 valeur 3
Défiler la
valeur 16

31 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File
 Les files représentent une notion abstraite (une spécification de
structure de données) et nécessitent d’être implémenter à
travers des structures de données réelles pour être concrétiser
 Une file peut être implémentée par un tableau (appelée file
statique) ou par une liste chaînée (appelée file dynamique)
 Comme dans le cas des piles :
 La gestion par tableaux présente l’inconvénient que la file a une
capacité limitée, contrairement à la gestion par listes chaînées
 On gère les files à l’aide de primitives (ensemble de fonctions et
de procédures à définir)

32 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File
 Les primitives de gestion des files sont les suivantes :
 creerFile : cette fonction crée et retourne une file vide
 estVideFile : cette fonction renvoie vrai si la file est vide, faux sinon
 estPleineFile : cette fonction renvoie vrai si la file est pleine, faux sinon
Cette fonction est applicable uniquement sur les files statiques
 Tete : cette fonction permet l’accès à l’information contenue dans la
tête de la file
 Enfiler : cette fonction permet d’ajouter un élément à la queue de la
file. La fonction renvoie un code d’erreur en cas de manque de mémoire
 Defiler : cette fonction supprime la tête de la file
 ViderFile : cette fonction vide la file

33 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File
 Le principe de file est notamment utilisé :
 Dans les systèmes d’exploitation, pour gérer les impressions (spouleurs
d’impression), l’ordonnancement des processus, et plus généralement
l’attente
 En intelligence artificielle, dans les algorithmes d’exploration d’arbres
de recherche, pour effectuer par exemple un parcours en largeur

34 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File
 Le principe de gestion des files est que, lorsqu’on utilise une
file, on ne se préoccupe pas de la manière dont elle a été
implémentée (tableau ou liste chainée), mais on utilise
uniquement les primitives qui sont toujours les mêmes

 Dans ce qui suit, on fera l’hypothèse qu’on va manipuler des


files d’entiers. Cependant, on pourrait utiliser n’importe quel
autre type, y compris les types complexes

35 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File statique
 Les files statiques sont implémentées en utilisant les tableaux
 Cependant, cette fois on peut distinguer deux implémentations
différentes :
 Implémentation simple par tableau (comme on a fait avec les piles)
 Implémentation circulaire par tableau

36 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Structure de données (1/3)
 Comme pour la pile, pour implémenter une file avec un tableau, on a
besoin de connaître en permanence sa taille
 Toujours comme pour la pile, on peut utiliser un type structuré incluant
à la fois le tableau qui représente la file et l’entier qui représente sa
taille
« T_MAX » : est une
Type
constante qui indique la taille
Structure File
maximale du tableau et qui
taille : entier représente aussi le nombre
contenu : tableau [1..T_MAX] d’entiers maximale des éléments de la
Fin Structure pile

37 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Structure de données (2/3)
 Comme avec les piles, dans notre implémentation, nous avons le choix
entre deux possibilités pour manipuler la file :
 Soit on considère que la tête est au début du tableau :

 Soit on considère que la tête est à la fin de la partie du tableau occupée par
la file :

38 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Structure de données (3/3)
 À la différence de la pile, ici on travaille sur les deux côtés du tableau,
puisqu’on devra retirer les éléments du côté de la tête et rajouter les
éléments de l’autre côté. Donc les deux implémentations sont
comparables dans le sens où on devra gérer un décalage dans les deux
cas : pour défiler dans le premier cas, et pour enfiler dans le second cas.
 Il n’y a pas ici de meilleur choix. Nous choisissons arbitrairement la
première implémentation (ça peut être la deuxième aussi)

39 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Création Fonction creerFile ( ) : File
VAR
F : File
Début
F . taille  0
creerFile  F
FIN

 Vérification de la taille
Fonction estVideF (F:File) : booléen Fonction estPleineF (F:File) : booléen
VAR VAR
R : booléen R : booléen
Début Début
Si (F . taille = 0) alors Si (F . taille = T_MAX) alors
R  vrai R  vrai
sinon sinon
R  faux R  faux
fin si fin si
estVideFile  R
Mohamed Aymen CHARRADA - ISET El KEF - Info1
estPleineFile  R
40 24/05/2023
FIN FIN
Implémentation simple d’une file
statique
 Enfilement (1/2)
 L’enfilement se fait simplement en :
 Copier l’entier à insérer à la fin de notre représentation de la file ;
 Mettre à jour la taille de la file

41 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Enfilement (2/2)
.
Fonction enfiler (var F:File, X:entier) : entier
NB : l’argument « F » VAR
est passée par adresse Err : entier
puisque la fonction Début
« enfiler » va changer Err  0
son contenu si (estPleineFile (F^) = vrai) alors
La variable « Err » Err  -1
sinon
représente le code
F^.contenu[F^.taille+1]  X
d’erreur. Elle vaut « - F^.taille  F^.taille + 1
1 » si la file est pleine fin si
et « 0 » si tout va bien enfiler  Err
FIN

42 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Défilement (1/2)
 Le défilement consiste à :
 Décaler toutes les valeurs du tableau vers la gauche, supprimant ainsi la tête;
 Mettre à jour la taille de la file

43 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Défilement (2/2)

Fonction defiler (Var F:File) : entier


VAR
NB : l’argument « F » est
Err, i : entier
passée par adresse Début
puisque la fonction Err  0
« defiler » va changer son si (estVideFile (F^) = vrai) alors
contenu Err  -1
La variable « Err » sinon
représente le code pour i de 1 à F^.taille - 1 faire
F^.contenu [i]  F^.contenu [i+1]
d’erreur. Elle vaut « -1 » fin pour
si la file est vide et « 0 » F^.taille  F^.taille – 1
si tout va bien fin si
defiler  Err
Fin
44 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Implémentation simple d’une file
statique
 Accès à la tête de la file

Fonction tete (F:File) : entier


VAR
T : entier
Début
si (estVideFile (F) = faux) alors
T  F.contenu [1]
fin si
tete  T
FIN

45 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation simple d’une file
statique
 Vider la file

Procédure viderFile (Var F:File)


Début
F^.taille  0
FIN

NB : l’argument « F » est passée par


adresse puisque la fonction « vider »
va changer son contenu

46 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Structure de données (1/2)
 L’un des principaux problèmes de l’implémentation par tableau vient
des nombreux déplacements (décalages) de valeurs provoqués par
chaque opération
 Il est possible d’éviter cela en considérant que le tableau est refermé sur
lui-même (tableau circulaire). On parle alors d’implémentation
circulaire
 Avec l’implémentation circulaire, le début de la file ne correspond plus
forcément au début du tableau
 Ceci entraine des complications dans l’implémentation des opérations.
Mais l’intérêt est qu’en cas de défilement, au lieu de décaler toutes les
valeurs de la file, on se contentera de modifier son début

47 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Structure de données (2/2)

 Ceci a aussi des conséquences sur le type structuré utilisé, car on a


besoin de représenter le début de la file. Pour cela, nous allons
utiliser le type suivant : Type
Structure File
Le champ « debut »
debut : entier
indique l’indice de la taille : entier
position de tête de file contenu : tableau [1..T_MAX] d’entiers
48 Mohamed Aymen CHARRADA - ISET El KEF - Info1 Fin Structure 24/05/2023
Implémentation circulaire d’une file
statique
 Création
Fonction creerFile ( ) : File
VAR
F : File
Début
F . debut  -1
F . taille  0
creerFile  F
FIN

 Vérification de la taille
 Les fonctions « estVide » et « estPleine » sont exactement les mêmes que
dans l’implémentation simple par tableau, puisqu’elles reposent
seulement sur l’utilisation du champ « taille »

49 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Enfilement (1/3)
 Pour insérer un nouvel élément, on ne peut plus procéder exactement
comme dans l’implémentation simple par tableau, en copiant la
nouvelle valeur dans la case numéro « taille + 1 » du tableau
 En effet, le début de la file n’est pas forcément la case « 1 », donc le
numéro de la case où on doit écrire la nouvelle valeur n’est pas
forcément « taille + 1 »
 De plus, la file étant implémentée de manière circulaire, il est possible
que le numéro de la case de fin soit inférieur au numéro de la case de
début, comme dans l’exemple suivant :

50 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Enfilement (2/3)
 On utilisera donc une formule plus générale pour calculer le numéro de
la case où insérer la nouvelle valeur :
(debut+taille) % T_MAX + 1
 L’opérateur modulo (%) permet de se ramener à une valeur comprise
toujours entre 1 et T_MAX

51 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Enfilement (3/3)
NB .: l’argument « F »
Fonction enfiler (Var F:File, X:entier) : entier
est passée par adresse
VAR
puisque la fonction
Err, pos : entier
« enfiler » va changer
Début
son contenu Err  0
La variable « Err » si (estPleineFile (F^) = vrai) alors
représente le code Err  -1
d’erreur. Elle vaut « -1 » sinon
si la file est pleine et pos  (F^.debut + F^.taille) % T_MAX +1
« 0 » si tout va bien F^.contenu [pos]  X
La variable « pos » F^.taille  F^.taille + 1
indique la position de la fin si
fin de file en fonction de enfiler  Err
la formule donnée dans FIN
le diapo. précédent
52 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Implémentation circulaire d’une file
statique
 Défilement (1/3)
 Le défilement consiste à :
 Incrémenter le début de la file ;
 Mettre à jour la taille de la file
 On peut avoir le cas particulier suivant :

53 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Défilement (2/3)
 Par conséquent, on utilisera une formule reposant sur le même principe
que celle utilisée pour l’enfilement : le numéro de la nouvelle case de
début de la file sera :
(debut+1) % T_MAX

54 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Défilement (3/3)

NB : l’argument « F » est Fonction defiler (Var F:File) : entier


passée par adresse VAR
puisque la fonction Err : entier
« defiler » va changer son Début
Err  0
contenu si (estVideFile (F^) = vrai) alors
La variable « Err » Err  -1
représente le code sinon
d’erreur. Elle vaut « -1 » F^.debut  (F^.debut + 1) % T_MAX
si la file est vide et « 0 » F^.taille  F^.taille – 1
si tout va bien fin si
defiler  Err
FIN

55 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Accès à la tête de la file
 L’accès à la tête de la file se fait en utilisant le champ « debut », et non
plus la constante « 1 » comme dans l’implémentation simple

Fonction tete (F:File) : entier


VAR
T : entier
Début
si (estVideFile (F) = faux) alors
T  F.contenu [F.debut]
fin si
tete  T
FIN

56 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Implémentation circulaire d’une file
statique
 Vider la file

Procédure viderFile (Var F:File)


Début
F^.debut  -1
F^.taille  0
FIN

NB : l’argument « F » est passée par


adresse puisque la fonction « vider »
va changer son contenu

57 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File dynamique
 Structure de données (1/2)
 L’intérêt de représenter une file avec une liste chaînée est le même que
pour les piles : la taille ne sera pas limitée a priori
 Cependant, on aura aussi besoin de manipuler à la fois le début (pour
défiler) et la fin (pour enfiler) de la liste, donc nous utiliserons une liste
doublement chaînée
 Autrement dit : une file dynamique est une liste doublement chainée, la
tête de la file est situé au début de la liste chaînée

58 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File dynamique
 Structure de données (2/2)
 La première chose à faire est de déclarer les types structurés qui
modélisent une cellule et une file dynamique
Type
Type
Structure Cellule
Structure File
donnee : entier
debut : ^Cellule
suivant : ^Cellule
fin : ^Cellule
precedent : ^Cellule
Fin Structure
Fin Structure

59 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File dynamique
Fonction creerFile ( ) : File
 Création d’une File vide
Var
F : File
Début
F.debut  Nil
F.fin  Nil
creerFile  F
FIN

 Vérification de la taille : Fonction estVideFile (F:File) : booléen


VAR
La fonction « estPleineFile » R : booléen
n’est plus logique vu qu’une Début
Si (F.debut = Nil) alors
liste chainée n’a pas de taille R  vrai
sinon
limite (ne peut jamais être R  faux
pleine) fin si
estVideFile  R
60 Mohamed Aymen CHARRADA - ISET El KEF - Info1 FIN 24/05/2023
File dynamique
 Enfilement
 L’enfilement se fait simplement en rajoutant un élément à la fin de la
liste
Fonction enfiler (Var F:File, X:entier) : entier sinon
VAR Nv^.precedent  F^.fin
Err : entier (F^.fin)^.suivant  Nv
Nv : ^Cellule F^.fin  Nv
Début fin si
Err  0 fin si
allouer (Nv) enfiler  Err
si (Nv = Nil) alors Err  -1 Fin
sinon
Nv^.donnee  X Il faut traiter les deux cas : si la file est
Nv^.suivant  Nil initialement vide ou non
si (estVideFile (F^) = vrai) alors
Nv^.precedent  Nil
F^.debut  Nv
F^.fin
Mohamed Aymen  Nv - ISET El KEF - Info1
CHARRADA
61 24/05/2023
File dynamique
 Défilement
 Le défilement est réalisé en supprimant le premier élément de la liste
Fonction defiler (Var F:File) : entier
VAR
Err : entier
aux : ^Cellule
Début
Err  0
si (estVideFile (F^) = vrai) alors Err  -1
sinon
aux  F^.debut
F^.debut  aux^.suivant
(F^.debut)^.precedent  Nil
libérer (aux)
fin si
defiler  Err
62 FIN
Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
File dynamique
 Accès à la tête de la file
 Pour accéder à la tête, on renvoie la valeur du premier élément de notre
représentation de la file

Fonction tete (F:File) : entier


VAR
T : entier
Début
si (estVideFile (F) = faux) alors
T  (F.debut)^.donnee
fin si
tete  T
FIN

63 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


File dynamique
 Vider la file

Procédure viderFile (Var F:File)


Var
aux : ^Cellule
Début
tant que (estVideFile (F^) = faux) faire
aux  F^.debut
F^.debut  aux^.suivant
libérer (aux)
fin tant que
FIN

64 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


TD 5
Exercice 1
 Sachant que « P » est une depiler(P)
empiler(P,'B’)
pile de caractères, donnez Car  sommet (P)
le contenu de « P » après empiler(P,'a’)
exécution de la fonction empiler(P,Car)
essaie_pile  P
suivante :
fin

fonction essai_pile () : Pile


var
P: Pile
Car : caractère
debut
P  creerPile()
empiler(P,'A’)
66 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Exercice 2
 Sachant que « F » est une enfiler(F,'B’)
enfiler(F,'C’)
file de caractères, donnez defiler(F)
le contenu de « F » après Car  tete (F)
enfiler(F,'a’)
exécution de la fonction defiler(F)
suivante : enfiler(F,'b’)
enfiler(F,Car)
essaie_file  F
fonction essai_file () : File
fin
var
F: File
Car : caractère
debut
F  creerFile()
enfiler(F,'A’)
67 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Exercice 3
 Ecrire un algorithme « AfficheInv » qui demande à
l’utilisateur de saisir au clavier trois entiers positifs puis
les affiche dans l'ordre inverse de leur saisie. Il faut
utiliser la structure de données appropriée (pile ou file)

68 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Exercice 4
 Un problème fréquent pour les compilateurs et les traitements de
texte est de déterminer si les parenthèses et les crochets d’une
chaîne de caractères sont équilibrées et proprement incluses les unes
dans les autres. On désire donc écrire une fonction qui teste la
validité du parenthésage d’une expression :
 on considère que les expressions suivantes sont valides : « ( ) », « [ a+
(b-c)] » « [([bonjour+]essai)7plus- ]; »
 alors que les suivantes ne le sont pas : « ( », « )( », « 4(essai] »
 Notre but est donc d’évaluer la validité des parenthèses et des
crochets d’une expression (une chaîne de caractères). Écrire en
langage algorithmique la fonction :
valide(ch : chaîne de caractères) : booléen
qui retourne vrai si l’expression passée en paramètre est valide, faux
sinon en utilisant les piles et ou les files
69 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Exercice 5
 Un palindrome est une chaine de caractères qui se lit de
la même manière de gauche a droite et de droite a
gauche. En utilisant les piles et/ou les files, écrire un
algorithme qui lit au clavier une chaine « mot » puis
détermine si cette chaine est un palindrome ou non.
 Contrainte : Dans la solution proposée, il faut que la
chaine « mot » ne sera parcouru qu'une seule fois

70 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023


Exercice 6 (1/2)
 Soit « F » une file représentée par une liste chaînée, des villes
du gouvernorat du Kef, ayant dans chaque cellule une ville
sachant qu’une ville est identifiée à travers le nom (chaine), la
superficie de la ville (réel) et le nombre d’habitants (entier
long)
 Définissez les types structurés « Ville » et « Cellule » et « File »
 Écrire des fonctions ou procédures qui permettent de:
 Ajouter une ville dans la file : une fonction qui renvoie vrai si l’ajout est
bon, faux sinon
Fonction ajoutVille (Var F:File, N:chaine, A:réel, Nb:entier long) : booléen
Cette fonction doit créer une ville en utilisant les arguments N, A et Nb
puis enfiler la nouvelle ville dans la file
71 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023
Exercice 6 (2/2)
 Écrire des fonctions ou procédures qui permettent de:
 Supprimer la ville à la position « i » : une fonction qui renvoie vrai si
l’ajout est bon, faux sinon
Fonction suppVille (Var F:File, int i) : booléen
 Cette fonction doit vérifier si la file « F » contient « i » villes ou plus : si
oui, on procède à la suppression et on retourne vrai. Si non, on
retourne faux
 Supprimer toutes les villes dont le nom commence par un caractère
donné en argument
Procédure suppVilleCar (Var F:File, c:caractère)

72 Mohamed Aymen CHARRADA - ISET El KEF - Info1 24/05/2023

Vous aimerez peut-être aussi