Implémentation d'une pile impérative avec une tableau en C

/* implementation of the stack abstract data type (imperative interface)
   using a vector concrete data type */

#include 
#include 
#include "stack.h"

struct stack
{
  void **contents;
  int top;
  int size;
};

stack
stack_create(void)
{
  stack temp = malloc(sizeof(struct stack));
  temp -> size = 5;
  temp -> contents = malloc(temp -> size * sizeof(void *));
  temp -> top = 0;
  return temp;
}

void
stack_push(stack s, void *object)
{
  if(s -> top == s -> size)
    {
      s -> size *= 2;
      s -> contents = realloc(s -> contents, s -> size * sizeof(void *));
    }
  s -> contents[s -> top++] = object;
}

int
stack_empty(stack s)
{
  return s -> top == 0;
}

void *
stack_top(stack s)
{
  assert(!stack_empty(s));
  return s -> contents[s -> top - 1];
}

void
stack_pop(stack s)
{
  assert(!stack_empty(s));
  s -> contents[--s -> top] = NULL;
  if(s -> top * 4 < s -> size && s -> size > 5)
    {
      s -> size /= 2;
      s -> contents = realloc(s -> contents, s -> size * sizeof(void *));
    }
}