Generischer Stack
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 60 von 61.
Aufgabe
EinfachEin Stack ist eine grundlegende Datenstruktur, die dem Last-In-First-Out-(LIFO)-Prinzip folgt: Das zuletzt hinzugefügte Element wird als Erstes entfernt. Stell dir einen Tellerstapel vor: Du fügst oben etwas hinzu und entfernst es auch von oben.
Wir erstellen einen Generic Stack: eine vielseitige Datenstruktur, die mithilfe von void*-Zeigern jeden Datentyp speichern kann. Dein Stack folgt dem Last-In-First-Out-Prinzip und enthält alle wesentlichen operation.
Du organisierst deinen Code über drei Dateien:
stack.h: Define dieStack-Struktur mit drei members: einemvoid**-array für items, einemintfür den top index (next free slot) und einemintfür capacity. Declare function-Prototypen zum Erstellen eines Stacks (nimmt eine capacity entgegen), zum Hinzufügen eines item, zum Entfernen eines item, zum Anzeigen des obersten item, zum Prüfen, ob der Stack empty ist, und zum Freigeben des Stacks.stack.c: Implement deinen generischen Stack:create_stack: reserviert einen Stack auf dem heap, reserviert das items-array mit der given capacity, initialisiert top mit 0 und gibt den pointer zurückpush: fügt ein item oben hinzu, wenn Platz vorhanden ist (wenn top kleiner als capacity ist)pop: entfernt das oberste item und gibt es zurück oder gibtNULLzurück, wenn der Stack empty istpeek: gibt das oberste item zurück, ohne es zu entfernen, oderNULL, wenn der Stack empty istis_empty: gibt 1 zurück, wenn der Stack keine items hat, andernfalls 0free_stack: gibt zuerst das items-array und anschließend die Stack-Struktur selbst frei
main.c: Lies die Anzahl der auszuführenden operation. Lies anschließend für jede operation ein command:pushgefolgt von einem integer value,popoderpeek. Erstelle einen Stack mit capacity 10. Fürpushreserviere einen integer auf dem heap und füge dessen pointer hinzu. Fürpophole das item, gib dessen value aus und gib den integer frei. Fürpeekgib den value aus, ohne ihn zu entfernen. Wennpopoderpeekauf einem empty Stack aufgerufen wird, gibemptyaus. Gib nach allen operation die verbleibenden items und den Stack frei.
Dein Programm erhält:
- Die Anzahl der operation
- Jede operation in einer eigenen Zeile (
push X,popoderpeek)
Beispielausgabe, wenn die Eingaben 5, anschließend push 10, push 20, peek, pop, pop sind:
20
20
10Beispielausgabe, wenn die Eingaben 3, anschließend pop, push 42, peek sind:
empty
42Beispielausgabe, wenn die Eingaben 4, anschließend push 5, push 15, pop, pop sind:
15
5Denke daran, dass dein Stack void*-pointer speichert: Der Aufrufer ist dafür verantwortlich, die eigentlichen Daten zu reservieren und freizugeben. Wandle beim Entfernen den zurückgegebenen void* zurück in int* um, um auf den value zuzugreifen. Verwende strcmp aus <string.h>, um command-Strings zu vergleichen.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Erstelle einen Stack mit Kapazität 10
// TODO: Verarbeite jede Operation
for (int i = 0; i < n; i++) {
char command[10];
scanf("%s", command);
if (strcmp(command, "push") == 0) {
int value;
scanf("%d", &value);
// TODO: Allokiere einen Integer auf dem Heap und pushe seinen Zeiger
}
else if (strcmp(command, "pop") == 0) {
// TODO: Poppe das Element
// - Wenn nicht NULL, Wert ausgeben und den Integer freigeben
// - Wenn NULL (leerer Stack), "empty" ausgeben
}
else if (strcmp(command, "peek") == 0) {
// TODO: Peeke auf das oberste Element
// - Wenn nicht NULL, Wert ausgeben (nicht entfernen oder freigeben)
// - Wenn NULL (leerer Stack), "empty" ausgeben
}
}
// TODO: Gib alle verbleibenden Elemente im Stack frei
// TODO: Gib den Stack selbst frei
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler