Les Piles en Langage C
Les Piles en Langage C
Les Piles en Langage C
Les piles
Requis I. INTRODUCTION II. Dfinition III. La construction du prototype d'un lment de la pile IV. Oprations sur les piles A. Initialisation B. Insertion d'un lment dans la pile C. ter un lment de la pile D. Affichage de la pile E. Rcupration de la donne en haut de la pile V. Exemple complet pile.h pile_function.h pile.c VI. Voir aussi
Requis
2 of 14
Les types de donnes Les structures L'utilisation de typedef Les pointeurs Les fonctions utilisateur Les listes simplement chanes Les listes doublement chanes
I. INTRODUCTION
Cette article a pour but la comprhension des piles. L'implmentation en fonction du besoin vous appartient. Pour expliquer l'algorithme j'ai choisi d'utiliser une liste simplement chane. Donc la comprhension des listes chanes est ncessaire.
II. Dfinition
La pile est une structure de donnes, qui permet de stocker les donnes dans l'ordre LIFO (Last In First Out) - en franais Dernier Entr Premier Sorti). La rcupration des donnes sera faite dans l'ordre inverse de leur insertion. Pour l'implmentation j'ai choisi une liste simplement chane, prsente sur la verticale. L'insertion se faisant toujours au dbut de la liste, le 1er lment de la liste sera le dernier lment saisi, donc sa position est en haut de la pile. Je n'ai pas utilis un pointeur fin, comme je l'ai fait dans le cas des listes simplement chanes, puisque le but ce n'est pas de traiter une liste chane, mais la pile. Ce qui nous intresse c'est que le dernier lment entr, sera le 1er lment rcupr.
3 of 14
Pour permettre les oprations sur la pile, nous allons sauvegarder certains lments : le premier lment le nombre d'lments
Le 1er lment, qui se trouve en haut de la pile, nous permettra de raliser l'opration de rcupration des donnes situes en haut de la pile. Pour raliser cela, une autre structure sera utilise (ce n'est pas obligatoire, des variables peuvent tre utilises). Voici sa composition :
typedef struct ListeRepere{ Element *debut; int taille; } Pile;
Le pointeur debut contiendra l'adresse du premier lment de la liste. La variable taille contient le nombre d'lments. Observation : Nous n'utilisons pas cette fois un pointeur fin (voir les listes simplement chanes), puisque nous n'en avons pas besoin, vu que nous travaillons qu'au dbut de la liste. Quelque soit la position dans la liste, le pointeur debut pointe toujours vers le 1er lment, qui sera en haut de la pile. Le champ taille contiendra le nombre d'lments de la pile, quelque soit l'opration effectue sur la pile.
4 of 14
Prototype de la fonction :
void initialisation (Pile *tas);
Cette opration doit tre faite avant toute autre opration sur la pile. Elle initialise le pointeur debut avec le pointeur NULL, et la taille avec la valeur 0. La fonction
void initialisation (Pile * tas){ tas->debut = NULL; tas->taille = 0; }
Prototype de la fonction :
int empiler (Pile *tas, char *donnee);
La 1re image montre le dbut de l'insertion, donc la liste a la taille 1 aprs l'insertion. La caractristique de la pile n'est pas trs bien mise en vidence avec un seul lment, puisque c'est le seul rcuprer.
5 of 14
En revanche la 2me image nous permet d'observer le comportement de la pile. La chose qu'il faut retenir, c'est que l'insertion se fait toujours en haut de la pile (au dbut de la liste).
La fonction
/* empiler (ajouter) un lment dans la pile */ int empiler (Pile * tas, char *donnee){ Element *nouveau_element; if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL) return -1; if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char))) == NULL) return -1; strcpy (nouveau_element->donnee, donnee); nouveau_element->suivant = tas->debut; tas->debut = nouveau_element; tas->taille++; }
6 of 14
vers lequel pointe le pointeur debut. Cette opration ne permet pas de rcuprer la donne en haut de la pile, mais seulement de la supprimer. Prototype de la fonction :
int depiler (Pile *tas);
La fonction renvoie -1 en cas d'chec sinon elle renvoie 0. Les tapes : le pointeur supp_elem contiendra l'adresse du 1er lment le pointeur debut pointera vers le 2me lment (aprs la suppression du 1er lment, le 2me sera en haut de la pile) la taille de la pile sera dcrmente d'un lment
La fonction
int depiler (Pile * tas){ Element *supp_element; if (tas->taille == 0) return -1; supp_element = tas->debut; tas->debut = tas->debut->suivant; free (supp_element->donnee); free (supp_element); tas->taille--; return 0; }
D. Affichage de la pile
7 of 14
Pour afficher la pile entire, il faut se positionner au dbut de la pile (le pointeur debut le permettra). Ensuite, en utilisant le pointeur suivant de chaque lment, la pile est parcourue du 1er vers le dernier lment. La condition d'arrt est donne par la taille de la pile. La fonction
/* affichage de la pile */ void affiche (Pile * tas){ Element *courant; int i; courant = tas->debut; for(i=0;i<tas->taille;++i){ printf("\t\t%s\n", courant->donnee); courant = courant->suivant; }
V. Exemple complet
pile.h
/*********************\ * pile.h * \*********************/ typedef struct ElementListe{ char *donnee; struct ElementListe *suivant; } Element; typedef struct ListeRepere{ Element *debut; int taille; } Pile; /* initialisation */ void initialisation (Pile *tas);
8 of 14
/* EMPILER*/ int empiler (Pile *tas, char *donnee); /* DEPILER*/ int depiler (Pile *tas); /* Affichage de lment en haut de la pile (LastInFirstOut) */ #define pile_donnee(tas) tas->debut->donnee /* Affiche la pile */ void affiche (Pile *tas);
pile_function.h
/***********************\ * pile_function.h * \***********************/ void initialisation (Pile * tas){ tas->debut = NULL; tas->taille = 0; } /* empiler (ajouter) un lment dans la pile */ int empiler (Pile * tas, char *donnee){ Element *nouveau_element; if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL) return -1; if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char))) == NULL) return -1; strcpy (nouveau_element->donnee, donnee); nouveau_element->suivant = tas->debut; tas->debut = nouveau_element; tas->taille++; } /* depiler (supprimer un lment de la pile */ int depiler (Pile * tas){ Element *supp_element; if (tas->taille == 0) return -1; supp_element = tas->debut; tas->debut = tas->debut->suivant; free (supp_element->donnee); free (supp_element); tas->taille--; return 0; } /* affichage de la pile */ void affiche (Pile * tas){ Element *courant; int i; courant = tas->debut; for(i=0;i<tas->taille;++i){ printf("\t\t%s\n", courant->donnee); courant = courant->suivant; }
9 of 14
pile.c
/*********************\ * pile.c * \*********************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include "pile.h" #include "pile_function.h" int main () { Pile *tas; char *nom; if ((tas = (Pile *) malloc (sizeof (Pile))) == NULL) return -1; if ((nom = (char *) malloc (50 * sizeof (char))) == NULL) return -1; initialisation (tas); printf ("Entrez un mot : "); scanf ("%s", nom); empiler (tas, nom); printf ("La pile (%d lments): \n",tas->taille); printf("\n********** Haut de la PILE **********\n"); affiche(tas); printf("__________ Bas de la PILE __________\n\n"); printf ("Entrez un mot : "); scanf ("%s", nom); empiler (tas, nom); printf ("La pile (%d lments): \n",tas->taille); printf("\n********** Haut de la PILE **********\n"); affiche(tas); printf("__________ Bas de la PILE __________\n\n"); printf ("Entrez un mot : "); scanf ("%s", nom); empiler (tas, nom); printf ("La pile (%d lments): \n",tas->taille); printf("\n********** Haut de la PILE **********\n"); affiche(tas); printf("__________ Bas de la PILE __________\n\n"); printf ("\nLe dernier entr (LastInFirstOut) [ %s ] sera supprim", pile_donnee(tas)); printf ("\nLe dernier entr est supprime\n"); depiler (tas); /* suppression de dernier element entre */ printf ("La pile (%d lments): \n",tas->taille); printf("\n********** Haut de la PILE **********\n"); affiche(tas); printf("__________ Bas de la PILE __________\n\n"); } return 0;
10 of 14