/* 
 Type Abstrait PILE de caractères 
 Copyright: Free 
 Author: Najib Tounsi 
 Date: 06/10/04 00:19 
 Description: TAD pile en langage C 
 */ 

/* 
 * Structure de données d'une pile  
 */ 
#define MAX 20 
typedef struct { 
    char t[MAX]; /* tableau des éléments empilés */ 
    int top;     /* indice du sommet de la pile */ 
} * PILE;   

/* 
 * Interface abstraite : Opérations que l'on fait sur une pile 
 (déclarations des profiles) 
 */ 


PILE create();
/* crée et initialise une pile vide */

void empile(PILE, char); 
/* empile le caractère donné */ 

char sommet(PILE); 
/* retourne le caractère au sommet de la pile */ 

void depiler(PILE); 
/* décapite la pile (retire le sommet ) */ 

int estVide(PILE); 
/* teste si la pile est vide */ 

int estPleine(PILE); 
/* teste si la pile est pleine */ 


/* 
 * Representation (Implementation) 
 * On choisit une structure de donnees 
 * et on programme les opérations 
 */ 

/* cf. structure de données plus haut */ 
/* Programmation des opérations */ 

PILE create(){
    /* On crée une pile et on retourne son adresse */
    PILE p = (PILE) malloc(MAX);
    p->top = -1; 
    return p;
} 

void empiler(PILE p, char c){ 
    printf("j empile %c sur %s\n", c, p->t);
    if (!estPleine(p)) 
        p->t[++p->top] = c; 
    else 
        printf("Pile Pleine : %c\n", p->t[p->top]); 
} 

char sommet(PILE p){ 
    return p->t[p->top]; 
} 

void depiler(PILE p){ 
    if (!estVide(p)) 
        p->top--; 
    else 
        printf("Pile vide\n"); 
} 

int estVide(PILE p){ 
    return (p->top < 0); 
} 

int estPleine(PILE p){ 
    return (p->top >= (MAX - 1)); 
}
