Stack Programmierung in C

Hat jemand von euch gute Beispiele zur Implementierung eines Stacks (FIFO) in C gesehen? Wenn ja könnte der/diejenige einen Link dazu posten?

Habe bisher nicht viel mit dynamischer Speicherverwaltung gemacht und steh da irgend wie auf dem Schlauch.

Besten Dank im Voraus.

Grüsse

Emanuel

Hat jemand von euch gute Beispiele zur Implementierung eines
Stacks (FIFO) in C gesehen? Wenn ja könnte der/diejenige einen
Link dazu posten?

Meinst du wirklich reines C oder C++?

Habe bisher nicht viel mit dynamischer Speicherverwaltung
gemacht und steh da irgend wie auf dem Schlauch.

Ist eigentlich nicht weiter schwierig. Der Stack an sich kennt zwei Elemente: das oberste und (nur für Verwaltungszwecke) das unterste. Ein Stack und die Stackelemente sehen grob so aus:

struct Stack {
 StackElement\* bottom;
 StackElement\* top;
};

struct StackElement {
 StackElement\* next;
 data\_t\* data;
};

Die Stackoperationen sind push, pop und top. Was die machen, solltest du wissen, da sich die Frage schon so herrlich nach Hausaufgaben anhört. Du musst nur darauf achten, dass:

  • push und pop korrekt bottom und top vom Stack überprüfen und setzen. Hier müssen auch die Verwaltungsaufgaben wie das dynamische Anlegen der StackElements erledigt werden.

  • top nur die eigentlichen Daten des obersten Stackelements liefert

In C++ ist das dank STL etwas einfacher. Viel Spass.

Meinst du wirklich reines C oder C++?

Ja reines C, meinem Dozenten stellen sich die Nackenhaare
auf, wenn ich C++ programmiere.

Es ist bestandteil unseres Programmierpraktikums, und das Vorlesungsscipt gibt da leider nicht viel her. Statt das Ganze an einem gut dokummentiertes Beispiel zu erleutern bekommt man da ein par Programmschnippsel vorgeworfen.

Werd mich dann wohl weiter auf der Suche nach einem Beispel machen das ich nachvollziehen kann.

Grüsse

Emanuel

Meinst du wirklich reines C oder C++?

Ja reines C, meinem Dozenten stellen sich die Nackenhaare
auf, wenn ich C++ programmiere.

Naja, mit C kann man sich selbst in den Fuß schießen, C++ erledigt gleich das ganze Dorf. Aber ansonsten kann man mit der EInstellung auch gleich Java nehmen :wink:

Es ist bestandteil unseres Programmierpraktikums, und das
Vorlesungsscipt gibt da leider nicht viel her. Statt das Ganze
an einem gut dokummentiertes Beispiel zu erleutern bekommt man
da ein par Programmschnippsel vorgeworfen.

Das ist wirklich übel.

Werd mich dann wohl weiter auf der Suche nach einem Beispel
machen das ich nachvollziehen kann.

Das grobe Stack-Konzept ist dir schon vertraut, oder? Ein Stapel bei dem man jeweils nur an das oberste Element mit den Operationen Push, Pop und Top rankommt.

Du nimmst also die Datenstrukturen aus meiner ersten Antwort. Nehmen wir beispielsweise mal an, dass du irgendwelche Strings verwalten willst.

#include 
#include 

struct StackElement {
 StackElement\* previous;
 char\* data;
};

/\* struct Stack ist wie gehabt \*/

char\* Top( struct Stack\* s ) {
 return s-\>top-\>data;
}

void Pop( struct Stack\* s ) {
 struct StackElement\* temp;

 /\* Wir benutzen NULL als eine Art Markierung
 \* des Stack-Bodens \*/
 if( s-\>top != NULL ) {
 temp = s-\>top;
 s-\>top = temp-\>previous;
 /\* Freigeben des Speichers, der in Push reserviert wird \*/
 free( temp );
 }
}

void Push( struct Stack\* s, char\* ptr ) {
 struct StackElement\* nse;

 /\* Speicher für ein neues StackElement reservieren \*/
 nse = (struct StackElement\*)malloc( sizeof(struct StackElement) );
 
 /\* nse initialisieren \*/
 nse-\>previous = s-\>top;
 nse-\>data = ptr;

 /\* nse als neues top-Element des Stacks eintragen \*/
 s-\>top = nse;
}

int main( void ) {
 Stack s;

 /\* Daten zum Testen \*/
 char\* data[] = {
 "Test 1",
 "Test 2",
 "Test 3"
 };

 /\* Erstmal die Elemente vernünftig einstellen \*/
 s.botom = NULL;
 s.top = NULL;

 /\* Jetzt geben wir ein paar Elemente auf den Stack \*/
 Push( &s, data[0] );
 Push( &s, data[1] );
 Push( &s, data[2] );

 /\* ... und lesen sie wieder aus \*/
 printf( "%s\n", Top( &s ) );
 Pop( &s );
 printf( "%s\n", Top( &s ) );
 Pop( &s );
 printf( "%s\n", Top( &s ) );
 Pop( &s );

 exit(0);
}

Das ganze ist ohne Garantie auf Lauffähigkeit oder Korrektheit (einfach nur schnell hier in die Eingabebox gehackt). Außerdem kann es sein, dass malloc() einen Nullpointer zurückgibt, was korrekt gehandhabt werden sollte.

In C++ wäre das ganze in etwa ein Dreizeiler.

1 Like

Dann noch ein ganz grosses DANKESCHÖN. Mein Programm ist jetzt fertig und wie ein Stack funktioniert hab ich jetzt endlich auch begriffen.

Grüsse

Emanuel