1 La Pile 2 Le Type Abstrait File Réalisation en C
1-La Pile
Type Abstrait: pile d objets
Opérations - Créer une pile (vide) - Empiler un élément - Dépiler - Prendre le sommet de pile - Tester si la pile est vide
Spécification du Type Abstrait Type Pile utilise Elt Bool opérations creer: Pile sommet:pile Elt empile: Elt, Pile Pile depile: Pile Pile vide:pile Bool Préconditions: depile, sommet définies ssi la pile est non-vide
Spécification(suite): les axiomes et d autres... sommet(empile(e,p))=e depile(empile(e,p))=p vide(empile(e,p))=false
2-
Représentation classique Paire tableau d élémént + indice du sommet 1 Surdimentionner le tableau 2 Valeur de l indice pour la pile vide
Représentation classique Paire tableau d élémént + indice du sommet 1 Surdimentionner le tableau 2 Valeur de l indice pour la pile vide = paire (tableau, indice) à réaliser par
Représentation classique Paire tableau d élémént + indice du sommet 1 Surdimentionner le tableau 2 Valeur de l indice pour la pile vide = paire (tableau, indice) à réaliser par une Structure C
Le type C pile d élément typedef struct ELT un type défini. {ELT tab [MAX]; int ind;} PILE;
Le type C pile d élément typedef struct {ELT tab [MAX]; int ind;} PILE; ELT un type défini. cette représentation amène des restrictions supplémentaires pour la fonction
Le type C pile d élément typedef struct {ELT tab [MAX]; int ind;} PILE; ELT un type défini. empiler ne pas empiler si la pile est pleine!
Les Fonctions Pile: SD de travail réalisation non fonctionnelle plus appropriée. #define MAX 100 /*hauteur de pile*/... PILE creer();... PILE creer(){ /*creation d une pile vide*/ PILE l; l.ind=-1; return l; } int vide(pile * pp){ /* renvoie vrai si la pile pointee par pp est vide*/ return (pp->ind==-1); }
Les Fonctions (suite) void empile(int e, PILE * pp){ /*empile e sur la pile */ assert(pp->ind <MAX-1); /*pointee par pp */ int i=pp->ind+1; pp->tab[i]=e; pp->ind=i; } void depile(pile * pp){ /*depile le sommet de la pile */ assert(!vide(pp)); /*pointee par pp */ pp->ind=pp->ind-1; } int som(pile * pp){ /*retourne le sommet de */ assert(!vide(pp)); /*la pile pointee par pp */ return pp->tab[pp->ind]; }
Représentation avec liste chainées Peu utilisée: pas d interêt particulier pour l efficacité Seuls avantages, pas de limite sur le nombre d élément et moins de place mémoire. 1 Pile vide: pointeur NULL 2 Pile: pointeur sur la cellule de tête. Exercice: écrire toutes les fonctions précédentes avec cette représentation.
Le Type Abstrait File Réalisation en C 2-
Le Type Abstrait File Réalisation en C Le Type Abstrait File Principe: ajout à un bout et retrait à un autre Type File utilise Elt Bool opérations creer: File premier:file Elt dernier:file Elt ajout: Elt, File File supprime: File File vide:file Bool pleine:file Bool Précondition:premier, dernier, supprime définies si la file est non vide.
Le Type Abstrait File Réalisation en C Le Type Concret Représentation par tableau: 1 tableau d élément 2 indice du premier élément 3 indice du dernier élément File vide: indice du premier=indice du dernier=-1
Le Type Abstrait File Réalisation en C Cas possibles file premier <=dernier 0 i j MAX 1 premier dernier file file premier >=dernier 0 j dernier i premier MAX 1
Le Type Abstrait File Réalisation en C Principe de l Algorithme pour ajout FILE ajout(file file, Elt e) precondition: la file est non pleine postcondition: la file est non vide si vide(file) alors tab[1] e iprem 0 ider 0 sinonsi file.iprem<ider et file.ider==max-1 alors file.ider 0 file.tab[file.ider] e fsi sinonsi file.iprem<file.ider et file.ider<max-1 alors file.ider 0 file.tab[file.ider] e fsi sinonsi file.ider<file.iprem alors file.ider=file.ide+1; file.tab[file.ider] e fsi fsi retourner file fin Amelioration: factoriser affectation + 2 derniers cas
Le Type Abstrait File Réalisation en C Programme C Version fonctionnelle peu efficace (recopie de file) Version avec pointeurs (autre solution: définir FILE comme un pointeur sur la structure) void ajout (Elt e, FILE * pf){ assert (!pleine(* pf)); if (vide(* pf)) {pf->tab[0]=e; pf->iprem=1; pf->ider=1;} else if (pf->iprem <ider && file->ider==max-1) pf->ider=1; else pf->ider++; pf->tab[file->ider]=e; }
Le Type Abstrait File Réalisation en C int vide (FILE * pf) { /* retourne vrai ssi la file pointee par pf est vide */ return (pf->ider==-1) &&(pf->iprem==-1); } FILE * creer() { FILE * pf; pf=(file *)malloc(sizeof(file)); pf->ider=-1; pf->iprem=-1; return pf; }
Le Type Abstrait File Réalisation en C Le Type Concret Représentation par liste chainée: premier dernier