Académique Documents
Professionnel Documents
Culture Documents
Il n'y a pas de structures spécifiques prévues dans les langages de programmation pour les piles ou files. Il faut donc les créer
de toute pièce sachant que la représentation en mémoire de ces structures de données peut être, selon le besoin, statique
(utilisation des tableaux) ou dynamique (utilisation des listes).
Quand on ajoute un élément, celui-ci devient le sommet de la pile, c'est-à-dire le seul élément accessible.
Quant on retire un élément de la pile, on retire toujours le sommet è le dernier élément ajouté avant (avant le sommet) lui
devient alors le sommet de la pile.
Résumé
Pour résumer, le dernier élément ajouté dans la pile est le premier élément à en être retiré. Cette structure est
également appelée une liste LIFO (Last In, First Out).
1.2.3. Gestion des appels dans l’exécution des programmes (fonctions et procédures):
La notion de pile est très utilisée en programmation et beaucoup plus dans l’appel des procédures et fonctions.
M. bada 1
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
Ex : l’appel récursif (fonction factorielle)
Lors de l’appel, le compilateur réservera 2 cases (une pour le paramètre N de la fonction, et une pour la
variable de retour Fact ) è on dit que le compilateur empile les 2 variables.
L’appel fact (4) ne pourra pas terminer l’exécution, car fact (4) dépend de fact (3) è il faut appeler fact (3)
avant de terminer fact (4).
Quand on fait un appel à fact (3), il faut empiler encore 2 nouvelles cases (N= 3 , et fact = 3 *fact (2) )
Fact (3)
fact ???? = 3 * fact (2)
Sommet N 3
Fact ???? = 4* fact (3) Empiler
Fact ???? = 4* fact (3)
N 4 N 4
L’appel récursif (resp : l’empilement) continuera jusqu'à fact (0) = 1, qui est une valeur déterminé « la
condition d’arrêt »
M. bada 2
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
b) Etapes de dépilements (suppression) :
Une fois fact (0) =1 se termine l’exécution, il faut retourner le résultat à fact (1) « qui à fait l’appel fact(0) ».
Maintenant, on aura pas besoin de fact (0), et il faut bien libérer l’espace occuper par cet fonction (appel).
Ceci consiste à dépiler les deux cases qui se trouvent dans le sommet de la pile
Fact 24 = 4* 6
N 4
M. bada 3
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
1.3. Représentation d’une pile :
Il n'y a pas de structures spécifiques prévues dans les langages de programmation pour les piles ou files. Il faut donc
les créer de toute pièce sachant que la représentation en mémoire de ces structures de données peut être, selon le
besoin, statique (utilisation des tableaux) ou dynamique (utilisation des listes).
Il existe plusieurs manières pour représenter une Pile statique. En adoptant dans ce cours une représentation qui
évite le décalage des cases à chaque insertion ou suppression. Cependant cette représentation présente d’autres
inconvénients.
struct Pile {
TypeElement Tab [100] ;
int Sommet ;
};
typedef struct Pile Pile;
Note : Les données enregistrées dans la pile peuvent être des entiers, des réels, des caractères, des chaînes de
caractères, des booléens (n’existe pas en C), des tableaux, des pointeurs de listes ou encore des piles ou files.
Init_pile (Pile * P) {
(*P).Sommet = -1 ;
}
.....l’appel par adresse ......
Pile p1 ;
Init_pile (&p1) ;
M. bada 4
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
1.3.1.3. Vérification si la pile est pleine :
Pour vérifier s’il est possible de rajouter ou non un nouveau élément (utilisée dans le seul cas des piles statiques)
1.3.1.4. Empiler un élément : (Le passage de la pile doit être par Adresse)
Permet d’ajouter une nouvelle valeur (envoyé en paramètre par l’appelant) à la pile (au dessus du sommet et dans
le cas d’une pile non pleine) ;
Permet de supprimer une valeur (se trouvant au sommet de la pile) et de la renvoyer en paramètre. Cette
opération n’est possible que si la file n’est pas vide
M. bada 5
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
Du point de vue implémentation, il n’y a aucune différence entre une struct Element {
Pile dynamique et une liste chainée. La seule différence réside dans int info;
les opérations qu’on effectue sur la pile. Element* suivant;
};
Sur une Pile, l’ajout et la suppression d’un élément ne doivent
s’opérer qu’au début de la pile (Tête) typedef Element* pile;
pile Init_pile ( ){
return NULL;
.......................................................
L’appel : pile p1;
p1= Init_pile();
.......................................................
if (P==NULL){
return 1;
}else{
return 0;
}
}
1ere solution :
Passage de la pile par valeur : Dans ce cas, on aura une nouvelle pile :
//retourner la pile
return P;
}
...............................................................................................................................................
pile p1;
p1= Init_pile();
M. bada 6
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
2eme solution :
Dans ce cas, on envoie l’adresse de la pile (appel par adresse) è ajouter étoile avant P partout dans la
fonction.
...............................................................................................................................................
pile p1;
p1= Init_pile();
push2 (&p1,23);
push2 (&p1,13);
push2 (&p1,44);
...............................................................................................................................................
return x;
}
...............................................................................................................................................
l’appel : int a = pop (&p1);
...............................................................................................................................................
Note : Il n’y a pas de pile pleine pour les piles dynamiques. La seule possibilité de ne pas pouvoir ajouter un élément c’est
d’avoir une mémoire pleine, cas que l’on ne prend pas en considération ici.
M. bada 7
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
Une file d'attente est une structure qui stocke de manière ordonnée des éléments, mais rend accessible uniquement un
seul d'entre eux, appelé la tête de la file.
Quant on ajoute un élément, celui-ci devient le dernier élément qui sera accessible.
Quant on retire un élément de la file, on retire toujours la tête, celle-ci étant le premier élément qui a été placé dans
la file.
Résumé :
Pour résumer, le premier élément ajouté dans la pile est le premier élément à en être retiré. Cette structure est
également appelée une liste FIFO (First In, First Out)
• L’exemple le plus connu d’une file informatique est celui de l’impression de documents reçus par une
imprimante qui imprime le premier document arrivé et termine par le dernier.
• La gestion des programmes à exécuter
• Gérer des processus en attente d'une ressource système.
• La simulation : modélisation d’une file d’attente des clients devant un guichet
• les messages en attente dans un commutateur de réseau téléphonique.
M. bada 8
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
2.3.1. Représentation statique :
Une file statique est un enregistrement à 3 cases :
• Un tableau à hauteur maximale prévisible.
• Un indice entier qui pointe le premier élément insérer dans la file (Début).
• Un deuxième indice entier qui pointe la dernière valeur ajoutée (Queue).
struct File {
etudiant Tab [8] ;
int Debut;
int Queue ;
};
typedef struct File File;
Conditions :
Sachant que le tableau est indicé de 0 à N-1 et pour une gestion simpliste des files :
1- Une file qui vient d’être déclarée (et non encore utilisée) : Début = 0 et Queue = -1
Début =0
Queue =-1
2- Une file a un seul élément : Début = 0 et Queue = 0 (cas générale : Début = Queue)
Début =0
3
Queue =0
3 6 -5
Queue
=2
4- Une file complètement vidée : Début = Queue +1 (ou : Début > Queue)
Début =3
3 6 -5
Queue
=2
5- Une file pleine : Queue = N (le tableau est indicé de 0 jusqu'à N-1)
Début =3
3 6 -5 19 3 11
Queue =N-1
M. bada 9
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
Note : il existe une autre façon de considérer les files (en circulaire).
En effet, vu qu’en défilant c’est le Début qui se rapproche de la Queue et que les cases qui se
trouvent avant le Début sont supposées devenues vides è il est possible de les réutiliser si la file
est pleine d’en haut. è Il suffirait que Queue soit remise à 0 et s’incrémente jusqu’à comblement
des cases qui se trouvent avant le Début (ex : en jaune « i=0,1 et 2) .
è file circulaire pleine : Taille de la pile = N / taille = fin – début +1
M. bada 10
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
2.3.1.4. Enfiler un élément dans une file circulaire (passage par adresse) : (Queue = Queue + 1)
Il s’agit d’incrémenter (faire avancer la queue) la Queue de la file è ceci permet d’ajouter une nouvelle valeur
(envoyé en paramètre par l’appelant) à la file.
//initialiser e......
Enfiler(&f1,e);
M. bada 11
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
2.3.2. Représentation Dynamique d’une file:
struct Element {
int info;
Element* suivant;
};
file Init_file() {
return NULL;
.......................................................
L’appel : file f1;
f1= Init_file();
.......................................................
if (P==NULL){
return 1;
}else{
return 0;
}
M. bada 12
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
Element* position;
position= f;
if (f==NULL){
f=e;
return f;
}else {
// Enfiler un autre élément
position = (*position).suivant;
}
//établir la liaison
(*position).suivant= e;
return f;
}
}
............................................................................................................
file f1;
f1= Init_file();
Défiler est équivalent à dépiler et consiste à supprimer l'élément de tête si la file n'est pas vide.
if ( *f == NULL){
printf ("\n la file est vide \n");
}esle{
int x = (**f).info;
*f= (**f).suivant;
return x;
}
}
M. bada 13
Chapitre 4 : Les Piles et Les Files Université de Batna 2 Algorithmique et structures de données
3. Conclusion :
On a vue dans ce chapitre deux nouvelles structures de données qui sont très importante en informatique et qu’on les trouve
partout.
Le choix de l’implémentation des piles ou des files dépend du cas d’utilisation:
Une implémentation contiguë s’avère utile dans les cas où le volume d’information n’est pas important.
Dans le cas contraire, l’emploi des pointeurs permet d’économiser de l’espace mémoire.
M. bada 14