Menu
Coddy logo textTech

Pile générique

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 60 sur 61.

challenge icon

Défi

Facile

Une pile (stack) est une structure de données fondamentale qui suit le principe du "Dernier Entré, Premier Sorti" (LIFO — Last-In-First-Out) : le dernier élément ajouté est le premier à être retiré. Pensez à une pile d'assiettes : vous ajoutez au sommet et vous retirez du sommet.

Construisons une Pile Générique — une structure de données polyvalente capable de stocker n'importe quel type de données en utilisant des pointeurs void*. Votre pile suivra le principe LIFO, avec toutes les opérations essentielles.

Vous organiserez votre code sur trois fichiers :

  • stack.h : Définissez la structure Stack avec trois membres : un tableau void** pour les éléments, un int pour l'indice du sommet (prochain emplacement libre), et un int pour la capacité. Déclarez les prototypes de fonctions pour créer une pile (prend une capacité), empiler un élément (push), dépiler un élément (pop), consulter l'élément du sommet (peek), vérifier si la pile est vide, et libérer la pile.
  • stack.c : Implémentez votre pile générique :
    • create_stack — alloue une Stack sur le tas (heap), alloue le tableau d'éléments avec la capacité donnée, initialise le sommet à 0, et retourne le pointeur.
    • push — ajoute un élément au sommet s'il y a de la place (quand le sommet est inférieur à la capacité).
    • pop — retire et retourne l'élément du sommet, ou retourne NULL si la pile est vide.
    • peek — retourne l'élément du sommet sans le retirer, ou NULL si elle est vide.
    • is_empty — retourne 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 : Lisez le nombre d'opérations à effectuer. Ensuite, pour chaque opération, lisez une commande : push suivi d'une valeur entière, pop, ou peek. Créez une pile avec une capacité de 10. Pour push, allouez un entier sur le tas et empilez son pointeur. Pour pop, récupérez l'élément, affichez sa valeur et libérez l'entier. Pour peek, affichez la valeur sans la retirer. Si pop ou peek est appelé sur une pile vide, affichez empty. Après toutes les opérations, libérez les éléments restants et la pile.

Votre programme recevra :

  1. Le nombre d'opérations
  2. Chaque opération sur une ligne séparée (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'oubliez pas que votre pile stocke des pointeurs void* — l'appelant est responsable de l'allocation et de la libération des données réelles. Lors d'un dépilage (pop), transtypez le void* retourné en int* pour accéder à la valeur. Utilisez strcmp de <string.h> pour comparer les chaînes de commande.

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 (heap) et empiler son pointeur
        }
        else if (strcmp(command, "pop") == 0) {
            // TODO: Dépiler l'élément
            // - Si non 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 (peek)
            // - Si non NULL, afficher la valeur (ne pas supprimer 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 Object Oriented Programming