#include "stack.h" #include "alloc.h" #include #include #include #include ///////////////////////////////////////////////////////////////////////////////// // Fonctions auxiliaires ne pouvant pas être utilisées dans d'autres fichiers. // // Elles ne sont PAS déclarées dans stack.h et sont déclarées "static". Cela // // signifie qu'elles ne peuvent être utilisées QUE dans ce fichier, stack.c. // ///////////////////////////////////////////////////////////////////////////////// // Double la taille du tableau utilisé dans la représentation. // Cette fonction sera utilisée lorsque le tableau est plein et qu'on veut y // ajouter une valeur. static void grow_stack(stack *p) { p -> size_array *= 2; p -> array = realloc(p -> array, p -> size_array * sizeof(int)); return; } // Divise par deux la taille du tableau utilisé dans la représentation. // Cette fonction sera utilisée lorsque le tableau est rempli à moins de 25% de // sa capacité. static void shrink_stack(stack *p) { if (p -> size_array >= 2) { p -> size_array /= 2; p -> array = realloc(p -> array, p -> size_array * sizeof(int)); } return; } //////////////////////////////////////////////////////////////// // Fonctions primitives, exportées dans le fichier d'en-tête. // //////////////////////////////////////////////////////////////// stack *create_stack(void) { stack *p = malloc(sizeof(stack)); p -> size_array = 1; p -> size_stack = 0; p -> array = malloc(sizeof(int)); return p; } void delete_stack(stack *p) { if (p == NULL) return; free(p -> array); free(p); return; } bool isempty_stack(stack *p) { return p -> size_stack == 0; } int size_stack(stack *p) { return p -> size_stack; } int pop(stack *p) { if (p -> size_stack <= 0) { FATAL("Pop on empty stack"); } int val = p -> array[p -> size_stack - 1]; p -> size_stack--; if (p -> size_stack <= p -> size_array / 4) { shrink_stack(p); } return val; } void push(int val, stack *p) { if (p -> size_stack >= p -> size_array) { grow_stack(p); } p -> array[p -> size_stack] = val; p -> size_stack++; return; }