Académique Documents
Professionnel Documents
Culture Documents
en langage C
Abdellatif HAIR
Université Sultan Moulay Slimane
Faculté des Sciences et Techniques
B.P. 523, Béni-Mellal, MAROC
Chapitre 1 : LES PILES ET LES FILES
EXEMPLE D’APPLICATION
2
PILES : DÉFINITION
Les Piles (stack) constituent des structures de données
Une Pile est une liste linéaire dont une seule extrémité (le
sommet) est accessible -visible-
Ajouter Extraire
Exemple : une pile d'assiette
Lorsqu’on ajoute une assiette
en haut de la pile, on retire
toujours en premier celle qui
se trouve en haut sinon tout
le reste s'écroule
3
1. PILE: DÉFINITION ET REPRÉSENTATION
Les PILEs suivent une démarche LIFO (Last In First Out) :
les derniers éléments à être ajoutés à la pile seront les
premiers à être récupérés
Ajouter Extraire
Sommet
4
1. PILE: DÉFINITION ET REPRÉSENTATION
Différentes représentations
représentation statique
Un tableau, une variable globale indiquant le sommet
Un enregistrement avec deux champs
représentation dynamique
listes simplement chaînées ?
5
1. PILE: DÉFINITION ET REPRÉSENTATION
Exemple
D D
C C E E
B B B B B
A A A A A
dépilé dépilé empilé(E) empilé(D)
6
2. LES OPÉRATIONS DE BASE SUR LA PILE
On suppose que la pile est déclarée de la façon
suivante :
# define Max 20
Pile p;
int Sommet;
7
2. LES OPÉRATIONS DE BASE SUR LA PILE
fonction Push –Empiler- : insérer l’élément au sommet
de la pile
void Push(element x) {
if (Sommet>=Max-1)
else {
Sommet=Sommet+1;
p[Sommet]=x;
8
2. LES OPÉRATIONS DE BASE SUR LA PILE
fonction Pop –dépiler-: extraction de l’élément qui est au
sommet de la pile et le retourne comme valeur de la fonction
element Pop( ) {
element x;
if (Sommet<=-1) printf(" Stack Underflow ");
else {
x=p[Sommet]; Sommet=Sommet-1;
return x;
}
}
9
2. LES OPÉRATIONS DE BASE SUR LA PILE
fonction initialisation : initialiser la pile
initialisation( ) {
Sommet=-1;
int Pile_vide( ) {
return (Sommet<=-1);
10
3. EXEMPLE D’APPLICATION
traitement des expressions mathématiques
Si on a un seul type de délimiteur, on utilise un
compteur :
* A + B ) 0 0 0 0 -1
* ) A + B ( -C 0 -1 -1 -1 -1 0 0 0
11
3. EXEMPLE D’APPLICATION
traitement des expressions mathématiques
Si on a plus d’un délimiteur par exemple : ( [ {
12
3. EXEMPLE D’APPLICATION
Exemple : {x + (y - [a + b] ) * c - [ (d + e) ] }
[ (
( [ [
{ { { {
13
3. EXEMPLE D’APPLICATION
Pb d’underflow :
La Pile est vide et on essaie de dépiler : correspond à
une fermeture de plus
Pb d’overflow :
Dépassement de la capacité en nombre de délimiteur
ouvrant et fermant
14
3. EXEMPLE D’APPLICATION
Algorithme :
lire une Expression, mettre valide 1
tant qu’on a un symbole et valide=1 (Expr correcte) faire
si (symbole) est un délimiteur ouvrant alors empiler(symbole) fsi
si (symbole) est un délimiteur fermant alors
S dépiler
si S ne correspond pas au délimiteur fermant alors valide 0
(l’expression est incorrecte)
fsi
fsi
passer au symbole suivant
fin de tant que
si Pile_vide et valide=1 alors l’expression est correcte
sinon l’expression est incorrecte
fsi
15
3. EXEMPLE D’APPLICATION
#include<stdio.h>
#include<string.h>
# define Max 20
16
3. EXEMPLE D’APPLICATION
Fonction associe à chaque symbole fermant le symbole
ouvrant correspondant en le retournant
Exemple : ouvrant( ‘ ] ‘ ) doit retourner le symbole ‘ [ ‘
initialisation() { sommet=-1;}
17
3. EXEMPLE D’APPLICATION
main() {
element expression[4*Max];
element symbole, S;
int lon,i, Valide;
18
3. EXEMPLE D’APPLICATION
lon=strlen(expression); i=0; Valide=1;
while ((i<=lon-1) && (Valide==1)) {
symbole=expression[i];
if ((symbole==‘[‘ )||(symbole==‘(‘ )||(symbole==‘{‘ )) Push(symbole);
if ((symbole==‘]‘ )||(symbole==‘)‘ )||(symbole==‘}‘ ))
{ S=Pop();
if (S!= ouvrant(symbole)) Valide=0;
};
i++;
} /*fin de while*/
if (Pile_vide() && (Valide==1)) printf("expression correcte");
else printf("expression incorrecte");
system("pause");
}
19
4. FILE : DÉFINITION ET REPRÉSENTATION
Une FILE est une liste linéaire où toutes
les insertions se font par une extrémité (queue,arrière)
les extractions se font par l ’autre extrémité (avant, tête)
Extraction Insertion
20
4. FILE : DÉFINITION ET REPRÉSENTATION
But : une loi FIFO First In First Out le premier arrivé
est le premier servi
représentation :
un vecteur qui représente la FILE F[Max]
av, ar deux variables globales indiquant la tête et la
queue de la file
(1) (2) (3) (4)
C ar C ar
B
ar B B av
A av A av
ar inserer(C) extraire
av
21
5. LES OPÉRATIONS SUR LES FILES
initialisation : la file est vide au départ
ar -1 av -1
22
5. LES OPÉRATIONS SUR LES FILES
une première solution (Par décalage) : modifier
extraire de sorte lorsqu’un élément est retiré toute la
file est passée vers l’avant
On ignore la possibilité d’un Underflow (file vide)
x=F[0];
for (i=1; i<=ar; i++) F[i-1]=F[i]; // for (i=0; i<=ar-1; i++) F[i]=F[i+1];
ar=ar-1;
23
5. LES OPÉRATIONS SUR LES FILES
une seconde solution (par tableau circulaire) consiste à
voir la FILE comme un ensemble circulaire d’éléments
F[0], F[1], F[2], …, F[Max-1], F[0]
E ar=4 E E E E
D av=3 D av=3 D av=3
D D
C av=2 C av=2 H ar=2
G ar=1 G
ar=0 F ar=0 F F
F
inserer(F) Extraire( ) inserer(G) inserer(H)
24
5. LES OPÉRATIONS SUR LES FILES
On an aura un Overflow lorsque (ar+1)%Max==av
On an aura un Unverflow lorsque ????????
• sacrifier un élément
• par convention, l'élément d'indice av sera sacrifié et le 1er elt
à extraire se trouve alors à l'indice (av+1 modulo Max)
25
5. LES OPÉRATIONS SUR LES FILES
initialisation : av=0; ar=0; (initialiser par n’importe quelle valeur < max)
element extraire() {
element x;
if (file_vide()) printf("Underflow");
else {
if (av==Max-1) av=0; else av=av+1; //av=(av+1)%Max
x=F[av];
return x;
}
}
26
5. LES OPÉRATIONS SUR LES FILES
void inserer(element x) {
if (file_pleine()) printf("Overflow");
else {
F[ar]=x;
27