81 lines
2.2 KiB
C
81 lines
2.2 KiB
C
#include "stack.h"
|
|
#include "alloc.h"
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
// 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;
|
|
}
|