Pile générique
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 60 sur 61.
Défi
FacileUne 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 structureStackavec trois membres : un tableauvoid**pour les éléments, unintpour l'indice du sommet (prochain emplacement libre), et unintpour 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 uneStacksur 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 retourneNULLsi la pile est vide.peek— retourne l'élément du sommet sans le retirer, ouNULLsi 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 structureStackelle-même.
main.c: Lisez le nombre d'opérations à effectuer. Ensuite, pour chaque opération, lisez une commande :pushsuivi d'une valeur entière,pop, oupeek. Créez une pile avec une capacité de 10. Pourpush, allouez un entier sur le tas et empilez son pointeur. Pourpop, récupérez l'élément, affichez sa valeur et libérez l'entier. Pourpeek, affichez la valeur sans la retirer. Sipopoupeekest appelé sur une pile vide, affichezempty. Après toutes les opérations, libérez les éléments restants et la pile.
Votre programme recevra :
- Le nombre d'opérations
- Chaque opération sur une ligne séparée (
push X,pop, oupeek)
Exemple de sortie lorsque les entrées sont 5, puis push 10, push 20, peek, pop, pop :
20
20
10Exemple de sortie lorsque les entrées sont 3, puis pop, push 42, peek :
empty
42Exemple de sortie lorsque les entrées sont 4, puis push 5, push 15, pop, pop :
15
5N'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
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle