Pile générique
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 60 sur 61.
Défi
FacileUne 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 structureStackavec trois membres : un tableauvoid**pour les éléments, unintpour l’index du sommet (prochaine case libre) et unintpour 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 pointeurpush: 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 renvoieNULLsi la pile est videpeek: renvoie l’élément au sommet sans le retirer, ouNULLsi la pile est videis_empty: renvoie 1 si la pile ne contient aucun élément, 0 sinonfree_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 :pushsuivie d’une valeur entière,popoupeek. Créer une pile d’une capacité de 10. Pourpush, allouer un entier sur le tas et empiler son pointeur. Pourpop, récupérer l’élément, afficher sa valeur et libérer l’entier. Pourpeek, afficher la valeur sans la retirer. Sipopoupeekest appelé sur une pile vide, afficherempty. Après toutes les opérations, libérer les éléments restants ainsi que la pile.
Ton programme recevra :
- Le nombre d’opérations
- Chaque opération sur une ligne distincte (
push X,popoupeek)
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’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
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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne