Deux piles dans un seul tableau
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 7 — Structures séquentielles : listes, piles, files
Énoncé
On veut deux piles d'entiers partageant un tableau de cases, sans se limiter à chacune. Écrire, et prouver qu'aucune des deux ne peut écraser l'autre.
Corrigé
/* Deux piles dos a dos : A croit depuis la gauche, B depuis la droite.
INVARIANT : na >= 0, nb >= 0, na + nb <= CAPACITE.
La pile A occupe tab[0 .. na-1], la pile B occupe tab[C-nb .. C-1]. */
typedef struct { int tab[CAPACITE]; int na; int nb; } bipile;
bool empiler_a(bipile* p, int x) {
if (p->na + p->nb == CAPACITE) { return false; } /* plein : les deux */
p->tab[p->na] = x;
p->na = p->na + 1;
return true;
}
bool empiler_b(bipile* p, int x) {
if (p->na + p->nb == CAPACITE) { return false; }
p->tab[CAPACITE - 1 - p->nb] = x;
p->nb = p->nb + 1;
return true;
}
La preuve de non-recouvrement tient à l'invariant . La pile A occupe les indices à ; la pile B occupe les indices à . Ces deux intervalles sont disjoints si et seulement si , c'est-à-dire , c'est-à-dire : exactement l'invariant. Or les deux fonctions ne l'augmentent que lorsqu'il est strictement inférieur à , donc il est préservé.
Mesuré, avec : la pile A remplit à elle seule les huit cases si l'autre est vide ; et après dans A puis dans B, le tableau vaut
[10 11 12 . . 92 91 90] na = 3, nb = 3
On lit la pile B à l'envers dans le tableau : son sommet, le dernier empilé, est en case .
Ce que le procédé gagne. Deux piles séparées de capacité chacune débordent dès qu'une seule dépasse la moitié, même si l'autre est vide. Ici, les deux se partagent le tableau dynamiquement : le seul cas d'échec est celui où le total dépasse , et il est inévitable. C'est un cas particulier d'une idée générale — mettre en commun une réserve plutôt que la découper d'avance —, la même qui fait préférer une allocation dynamique à un tableau statique.
La limite, à dire honnêtement : le procédé ne se généralise pas à trois piles. Un tableau n'a que deux bouts.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.