init projet
This commit is contained in:
80
tp3/TP3/stack.c
Normal file
80
tp3/TP3/stack.c
Normal file
@@ -0,0 +1,80 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user