Chapitre 4: Les Files
sana.refai@gmail.com
1
Introduction ( ½)
Une file, ou file d'attente, est une liste chaînée
d'informations dans laquelle :
 Un élément ne peut être ajouté qu'à la queue de la
file,
 Un élément ne peut être retiré qu'à la tête de la file.
Il s'agit donc d'une structure de type FIFO (First In
First Out). Les données sont retirées dans l’ordre où
elles ont été ajoutées. Une file est comparable à une
queue de clients à la caisse d'un magasin.
2
Introduction ( 2/2)
.
Les files servent à traiter les données dans l'ordre où on les a
reçues et permettent de :
 gérer des processus en attente d'une ressource système (par
exemple la liste des travaux à éditer sur une imprimante)
 construire des systèmes de réservation
 etc
3
Les opérations sur les files
Les opérations autorisées avec une file sont :
 enfiler toujours à la queue et jusqu’à la limite de la mémoire
 défiler toujours à la tête si la file n’est pas vide,
 vérifier si la file est vide ou non.
4
Implémentation (1/2)
On peut implémenter une file dans un tableau (file
statique) ou dans une liste chaînée (file dynamique). C'est
l'implémentation en liste chaînée qui est présentée ici.
Il faut commencer par définir un type de variable pour
chaque élément de la file.
La déclaration est identique à celle d'une liste chaînée, par
exemple pour une file de chaînes de caractères :
5
Type File = ^Element
Type Element = Structure
Info : chaîne de caractères
Suivant : File
Fin Structure
Implémentation (2/2)
Pour ne pas avoir à parcourir toute la liste au moment
d'ajouter un élément en queue, on maintient un pointeur
de queue.
Attention une file peut très bien être simplement chaînée
même s'il y a un pointeur de queue.
Le pointeur de tête pointe sur le premier élément de la file,
et le pointeur de queue sur le dernier 6
Enfiler(1/2)
Enfiler un élément consiste à l'ajouter en queue de liste. Il
faut envisager le cas particulier où la file était vide. En effet,
dans ce cas, le pointeur de tête doit être modifié.
7
Procedure Enfiler (Entrée/Sortie : Tête, Queue : File, Entrée Valeur : variant)
Variable locale
P : File /* Pointeur nécessaire pour allouer la place au nouvel élément */
DEBUT
Allouer(P) /*1 Réserve un espace mémoire pour le nouvel élément */
P^.Info Valeur /* 2 stocke la valeur dans l'Info de l'élément pointé par P */
P^.Suivant Nil /*3 stocke Nil (ce sera le dernier de la file) dans Suivant */
SI Tête = Nil ALORS /* file vide */
Tête P /* 4 Tête pointe maintenant sur l'élément unique */
SINON /* il y a au moins un élément */
Queue^.Suivant P /* 4 bis le nouvel élément est ajouté au dernier */
FINSI
Queue P /*5 Queue pointe maintenant sur l'élément ajouté */
FIN
Enfiler(2/2)
8
Défiler(1/2)
Défiler est équivalent à dépiler et consiste à supprimer l'élément de tête
si la file n'est pas vide. Si la file a un seul élément, il faut mettre à jour le
pointeur de queue car on vide la file. Il faut conserver l'adresse de
l'élément qu'on supprime pour libérer sa place.
9
/* Suppression de l'élément de tête de la file passée en paramètre */
Procedure Défiler (Entrée/Sortie Tête, Queue : File, Sortie Valeur : Variant)
Variable locale
P : File /* Pointeur nécessaire pour libérer la place de l'élément supprimé */
DEBUT
SI Tête <> NIL ALORS /* la liste n'est pas vide donc on peut défiler */
Valeur  Tête^.info /* on récupère l'élément de tête */
P Tête /* on garde l'adresse du sommet pour désallouer */
Tête  Tête^.Suivant /* P va pointer sur le 2ème élément de la pile qui devient le
sommet */
Désallouer(P)
Si Tête = Nil ALORS
Queue Nil /* la file a été vidée */
FINSI FINSI
FIN
Défiler(2/2)
En faisant référence à la procédure SupprimerEnTete dans
les exercices à propos des listes chaînées simples, nous
pouvons écrire :
10
/* Suppression d'un élément dans une file */
Procedure Défiler (Entrée/Sortie Tête, Queue : File, Sortie Val : variant)
DEBUT
SI Tete <> Nil ALORS
Val  Tete^.Info
SupprimerEnTete(Tete)
SI tête = Nil alors
Queue Nil
FINSI
FINSI
FIN
Exercice (1/2)
6
Ecrire les Procédures et fonctions de base pour les
piles:
Procedure InitPile (Sortie Tête : Pile)
Fonction PileVide (Tête : Pile) : booléen
Fonction SommetPile (Tête : Pile) : variant
5 minutes 11
Exercice (2/2)
6
12
/* Initialise la création d’une pile */
Procedure InitPile (Sortie Tête : Pile)
DEBUT
Tête  Nil
FIN
/* indique si la pile est vide ou non*/
Fonction PileVide (Tête : Pile) : booléen
DEBUT
Retourner (Tête = Nil)
FIN
/* renvoie la valeur du sommet si la pile n'est pas vide */
Fonction SommetPile (Tête : Pile) : variant
DEBUT
SommetPile Tête^.Info
FIN
Exercice
6
Simuler la récursivité à l’aide d’une pile
Écrire un algorithme pour calculer la somme de 1 à n
∈ n ∈ N∗ en simulant la récursivité à l’aide d’une pile.
13
int triangularSum(unsigned n)
{ if (n == 0)
return 0;
pile p = initPile();
int val = n; int res = 0;
do
empiler(val, &p);
while (--val > 0);
do {
depiler(&val, &p);
res += val; }
while (! estPileVide(p));
return res; }
Exercice
6
Utiliser une pile pour Evaluer une expression
arithmétique postfixée codée sur un tableau de
caractères, en supposant pour simplifier que
– tous les opérateurs sont binaires et limités `a +, −, ∗
et /,
– on utilise uniquement des nombres sur un
caractère
Exemple:
((a * b) + ((a+b)* c)) a b * a b + c * +
14

Algo II: les files cours + exercices corrigés

  • 1.
    Chapitre 4: LesFiles sana.refai@gmail.com 1
  • 2.
    Introduction ( ½) Unefile, ou file d'attente, est une liste chaînée d'informations dans laquelle :  Un élément ne peut être ajouté qu'à la queue de la file,  Un élément ne peut être retiré qu'à la tête de la file. Il s'agit donc d'une structure de type FIFO (First In First Out). Les données sont retirées dans l’ordre où elles ont été ajoutées. Une file est comparable à une queue de clients à la caisse d'un magasin. 2
  • 3.
    Introduction ( 2/2) . Lesfiles servent à traiter les données dans l'ordre où on les a reçues et permettent de :  gérer des processus en attente d'une ressource système (par exemple la liste des travaux à éditer sur une imprimante)  construire des systèmes de réservation  etc 3
  • 4.
    Les opérations surles files Les opérations autorisées avec une file sont :  enfiler toujours à la queue et jusqu’à la limite de la mémoire  défiler toujours à la tête si la file n’est pas vide,  vérifier si la file est vide ou non. 4
  • 5.
    Implémentation (1/2) On peutimplémenter une file dans un tableau (file statique) ou dans une liste chaînée (file dynamique). C'est l'implémentation en liste chaînée qui est présentée ici. Il faut commencer par définir un type de variable pour chaque élément de la file. La déclaration est identique à celle d'une liste chaînée, par exemple pour une file de chaînes de caractères : 5 Type File = ^Element Type Element = Structure Info : chaîne de caractères Suivant : File Fin Structure
  • 6.
    Implémentation (2/2) Pour nepas avoir à parcourir toute la liste au moment d'ajouter un élément en queue, on maintient un pointeur de queue. Attention une file peut très bien être simplement chaînée même s'il y a un pointeur de queue. Le pointeur de tête pointe sur le premier élément de la file, et le pointeur de queue sur le dernier 6
  • 7.
    Enfiler(1/2) Enfiler un élémentconsiste à l'ajouter en queue de liste. Il faut envisager le cas particulier où la file était vide. En effet, dans ce cas, le pointeur de tête doit être modifié. 7 Procedure Enfiler (Entrée/Sortie : Tête, Queue : File, Entrée Valeur : variant) Variable locale P : File /* Pointeur nécessaire pour allouer la place au nouvel élément */ DEBUT Allouer(P) /*1 Réserve un espace mémoire pour le nouvel élément */ P^.Info Valeur /* 2 stocke la valeur dans l'Info de l'élément pointé par P */ P^.Suivant Nil /*3 stocke Nil (ce sera le dernier de la file) dans Suivant */ SI Tête = Nil ALORS /* file vide */ Tête P /* 4 Tête pointe maintenant sur l'élément unique */ SINON /* il y a au moins un élément */ Queue^.Suivant P /* 4 bis le nouvel élément est ajouté au dernier */ FINSI Queue P /*5 Queue pointe maintenant sur l'élément ajouté */ FIN
  • 8.
  • 9.
    Défiler(1/2) Défiler est équivalentà dépiler et consiste à supprimer l'élément de tête si la file n'est pas vide. Si la file a un seul élément, il faut mettre à jour le pointeur de queue car on vide la file. Il faut conserver l'adresse de l'élément qu'on supprime pour libérer sa place. 9 /* Suppression de l'élément de tête de la file passée en paramètre */ Procedure Défiler (Entrée/Sortie Tête, Queue : File, Sortie Valeur : Variant) Variable locale P : File /* Pointeur nécessaire pour libérer la place de l'élément supprimé */ DEBUT SI Tête <> NIL ALORS /* la liste n'est pas vide donc on peut défiler */ Valeur  Tête^.info /* on récupère l'élément de tête */ P Tête /* on garde l'adresse du sommet pour désallouer */ Tête  Tête^.Suivant /* P va pointer sur le 2ème élément de la pile qui devient le sommet */ Désallouer(P) Si Tête = Nil ALORS Queue Nil /* la file a été vidée */ FINSI FINSI FIN
  • 10.
    Défiler(2/2) En faisant référenceà la procédure SupprimerEnTete dans les exercices à propos des listes chaînées simples, nous pouvons écrire : 10 /* Suppression d'un élément dans une file */ Procedure Défiler (Entrée/Sortie Tête, Queue : File, Sortie Val : variant) DEBUT SI Tete <> Nil ALORS Val  Tete^.Info SupprimerEnTete(Tete) SI tête = Nil alors Queue Nil FINSI FINSI FIN
  • 11.
    Exercice (1/2) 6 Ecrire lesProcédures et fonctions de base pour les piles: Procedure InitPile (Sortie Tête : Pile) Fonction PileVide (Tête : Pile) : booléen Fonction SommetPile (Tête : Pile) : variant 5 minutes 11
  • 12.
    Exercice (2/2) 6 12 /* Initialisela création d’une pile */ Procedure InitPile (Sortie Tête : Pile) DEBUT Tête  Nil FIN /* indique si la pile est vide ou non*/ Fonction PileVide (Tête : Pile) : booléen DEBUT Retourner (Tête = Nil) FIN /* renvoie la valeur du sommet si la pile n'est pas vide */ Fonction SommetPile (Tête : Pile) : variant DEBUT SommetPile Tête^.Info FIN
  • 13.
    Exercice 6 Simuler la récursivitéà l’aide d’une pile Écrire un algorithme pour calculer la somme de 1 à n ∈ n ∈ N∗ en simulant la récursivité à l’aide d’une pile. 13 int triangularSum(unsigned n) { if (n == 0) return 0; pile p = initPile(); int val = n; int res = 0; do empiler(val, &p); while (--val > 0); do { depiler(&val, &p); res += val; } while (! estPileVide(p)); return res; }
  • 14.
    Exercice 6 Utiliser une pilepour Evaluer une expression arithmétique postfixée codée sur un tableau de caractères, en supposant pour simplifier que – tous les opérateurs sont binaires et limités `a +, −, ∗ et /, – on utilise uniquement des nombres sur un caractère Exemple: ((a * b) + ((a+b)* c)) a b * a b + c * + 14

Notes de l'éditeur

  • #2 Rechercher un element ds un tableau
  • #3 Rechercher un element ds un tableau
  • #4 Rechercher un element ds un tableau
  • #5 Rechercher un element ds un tableau
  • #6 Rechercher un element ds un tableau
  • #7 Rechercher un element ds un tableau
  • #8 Rechercher un element ds un tableau
  • #9 Rechercher un element ds un tableau
  • #10 Rechercher un element ds un tableau
  • #11 Rechercher un element ds un tableau
  • #12 Rechercher un element ds un tableau
  • #13 Rechercher un element ds un tableau
  • #14 Rechercher un element ds un tableau
  • #15 Rechercher un element ds un tableau