Menu
Coddy logo textTech

Pile générique

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 60 sur 61.

challenge icon

Défi

Facile

Une pile est une structure de données fondamentale qui suit le principe « dernier entré, premier sorti » (LIFO) : le dernier élément ajouté est le premier à être retiré. Pense à une pile d’assiettes : tu ajoutes par le haut et tu retires par le haut.

Construisons une pile générique : une structure de données polyvalente qui peut stocker n’importe quel type de données à l’aide de pointeurs void*. Ta pile suivra le principe « dernier entré, premier sorti », avec toutes les opérations essentielles.

Tu organiseras ton code dans trois fichiers :

  • stack.h : définir la structure Stack avec trois membres : un tableau void** pour les éléments, un int pour l’index du sommet (prochaine case libre) et un int pour la capacité. Déclarer les prototypes des fonctions permettant de créer une pile (en prenant une capacité), d’empiler un élément, de dépiler un élément, d’examiner l’élément au sommet, de vérifier si la pile est vide et de libérer la pile.
  • stack.c : implémenter ta pile générique :
    • create_stack : alloue une structure Stack sur le tas, alloue le tableau d’éléments avec la capacité donnée, initialise top à 0 et renvoie le pointeur
    • push : ajoute un élément au sommet s’il reste de la place (lorsque top est inférieur à capacity)
    • pop : retire et renvoie l’élément au sommet, ou renvoie NULL si la pile est vide
    • peek : renvoie l’élément au sommet sans le retirer, ou NULL si la pile est vide
    • is_empty : renvoie 1 si la pile ne contient aucun élément, 0 sinon
    • free_stack : libère d’abord le tableau d’éléments, puis la structure Stack elle-même
  • main.c : lire le nombre d’opérations à effectuer. Puis, pour chaque opération, lire une commande : push suivie d’une valeur entière, pop ou peek. Créer une pile d’une capacité de 10. Pour push, allouer un entier sur le tas et empiler son pointeur. Pour pop, récupérer l’élément, afficher sa valeur et libérer l’entier. Pour peek, afficher la valeur sans la retirer. Si pop ou peek est appelé sur une pile vide, afficher empty. Après toutes les opérations, libérer les éléments restants ainsi que la pile.

Ton programme recevra :

  1. Le nombre d’opérations
  2. Chaque opération sur une ligne distincte (push X, pop ou peek)

Exemple de sortie lorsque les entrées sont 5, puis push 10, push 20, peek, pop, pop :

20
20
10

Exemple de sortie lorsque les entrées sont 3, puis pop, push 42, peek :

empty
42

Exemple de sortie lorsque les entrées sont 4, puis push 5, push 15, pop, pop :

15
5

N’oublie pas que ta pile stocke des pointeurs void* : l’appelant est responsable de l’allocation et de la libération des données réelles. Lors du dépilage, convertis le void* renvoyé en int* pour accéder à la valeur. Utilise strcmp de <string.h> pour comparer les chaînes de commandes.

Essayez vous-même

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Créer une pile avec une capacité de 10
    
    // TODO: Traiter chaque opération
    for (int i = 0; i < n; i++) {
        char command[10];
        scanf("%s", command);
        
        if (strcmp(command, "push") == 0) {
            int value;
            scanf("%d", &value);
            // TODO: Allouer un entier sur le tas et empiler son pointeur
        }
        else if (strcmp(command, "pop") == 0) {
            // TODO: Dépiler l'élément
            // - Si ce n'est pas NULL, afficher la valeur et libérer l'entier
            // - Si NULL (pile vide), afficher "empty"
        }
        else if (strcmp(command, "peek") == 0) {
            // TODO: Consulter l'élément au sommet
            // - Si ce n'est pas NULL, afficher la valeur (ne pas retirer ni libérer)
            // - Si NULL (pile vide), afficher "empty"
        }
    }
    
    // TODO: Libérer tous les éléments restants dans la pile
    // TODO: Libérer la pile elle-même
    
    return 0;
}

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C en ligne