On a  vu au §
 que  les blocs d'activation  des fonctions
étaient des  blocs de mémoire  << empilés >> les  uns sur les autres, le
dernier empilé étant le premier retiré (en  anglais last in, first
  out  ou  LIFO),   comme une  vulgaire  pile  d'assiettes.   La
figure 
  montre le fonctionnement  d'une pile  ainsi que sa
représentation.
Les quatre opérations sur une pile sont : ajouter un élément au sommet de la pile (ou empiler), lire la valeur se trouvant au sommet d'une pile non-vide, tester si une pile est vide, retirer l'élément au sommet de la pile (ou dépiler).
En anglais, << pile >> se dit stack et les opérations portent respectivement les noms push, top, is_empty_stack, pop.
On va représenter les piles à l'aide de la structure suivante :
#define MAX 100
typedef struct {
  int height;
  stack_data content[MAX];
} stack;
   
 
Figure: Fonctionnement et représentation d'une pile
Si p est une pile, son contenu est donné par p.content[0], ..., p.content[h-1],
quand p.height vaut h>0 ; h=0 caractérise la pile vide. Les opérations sont implémentées facilement, par référence :
void mk_empty_stack(stack *p) {
  p->height = 0;
}
int is_empty_stack(const stack *p) {
  return p->height == 0;
}
void push(const stack_data x, stack *p) {
  p->content[p->height] = x;
  ++ p->height;
}
stack_data top(const stack *p) {
  return p->content[p->height - 1];
}
stack_data pop(stack *p) {
  -- p-> height;
  return p->content[p->height];
}
Ces fonctions ne sont pas entièrement satisfaisantes, car elles ne traitent pas des cas d'erreur.