Stack Implementation



  • plantplant schrieb:

    Ich weiß nicht wie ich

    Stack *create_stack(unsigned int);

    void push(Stack *, char);

    char pop(Stack *);

    int isEmpty(Stack *);

    void destroy_stack(Stack *);

    vervollständigen soll.

    Schon klar.

    Außerdem hab ich den Zeiger so noch nicht gesehn. Was soll Stack *create_stack(unsigned int); bedeuten?

    create_stack ist eine Funktion mit Rückgabetyp "Zeiger auf Stack".

    Ein Zeiger Namens create_stack zeigt auf Stack?

    Das wäre Stack *create_stack; , aber da steht ja noch eine Parameterliste, die bewirkt, dass es eine Funktion wird.

    Wie lese ich außerdem aus der Parameterklammer (Stack *)? Also was bedeutet das?

    Das ist dasselbe wie char pop(Stack *s); , der Name des Parameters wurde einfach weggelassen.



  • Danke, dann wär da schonmal Licht im Dunkeln...



  • Ich weiß trotzdem nicht wie ich implementieren soll



  • Siehe mein erstes Posting.



  • Hab ich ja gelesen aber nur weil eine Ahnung hab was ich machen muss, weiß ich noch nicht wie ich es machen muss & welche Operatoren hier angebracht sind.



  • Du solltest deine Überlegungen zu den Fragen hier posten. Dann gehts weiter.

    Sorry, aber falls es bisher irgendwie noch unklar geblieben ist: Ich werde dir die Lösung nicht auf dem Silbertablett präsentieren.



  • Ich weiß trotzdem nicht wie ich implementieren soll

    Kleine Hilfe:

    Stack* create_stack(unsigned int); {
    neues element von Stack erzeugen. 
    }
    
    void push(Stack *, char);{
    Bei Stack* ein Stack-Elemement übergeben. 
    Das Char am Ende anhängen. 
    depth um 1 ehöhen
    }
    
    char pop(Stack *); {
    das char an stelle "depth" auslesen. 
    Depth um 1 verringern. 
    char zurück geben
    }
    
    int isEmpty(Stack *);{
    könnte (vermutlich) depth zurück geben. 
    }
    
    void destroy_stack(Stack *);{
    Element wieder auflösen. 
    }
    


  • Total kontraproduktiv. 😕 Deine "Hilfe" ignoriert zudem die vorgegebene Bedeutung der struct-Member depth und top. Genau deshalb hab ich den OP doch gebeten, sich über diese Bedeutung erstmal klar zu werden ... wie sieht ein typisches Stack-Objekt eigentlich aus? Danach ergibt sich die Implementierung schon fast zwangsläufig.



  • Stack *s; (Der Zeiger s zeigt auf die Struktur Stack ?)
    s = create_stack(3); (Der Zeiger s zeigt auf die Funktion create_stack mit 3 Rückgabewerten?)



  • Jop. Meinte Top statt Depth.
    Wenn ich an seiner / ihrer Stelle wäre, würde es mir helfen. Also schreib ich auch.
    Und darauf, dass ich mit "top" bestimme(n könnte) wie voll der Stack ist statt mit Depth, hätte ich dann schon von selbst gemerkt.

    EDIT

    Stack *s; (Der Zeiger s zeigt auf die Struktur Stack ?)
    s = create_stack(3); (Der Zeiger s zeigt auf die Funktion create_stack mit 3 Rückgabewerten?)

    Stack *s ist eine Variable die auf ein Stack-Objekt zeigen könnte.

    create_stack(3); gibt ein Stack-Objekt zurück. *s zeigt auf dieses.



  • danke für die hilfe aber mir fehlt es eher an werkzeug.

    neues element von stack erzeugen? eine instanz von Stack?

    mfg



  • n3wbie schrieb:

    Jop. Meinte Top statt Depth.

    Wenn es so einfach wäre, hätte ich das schon gesehen und das auch geschrieben. Ist es aber nicht, z.B. soll top auf ein freies Feld zeigen. Bitte bedenke auch, dass der OP auf dem Level auch triviale Fehler in der Hilfe nicht immer selbst erkennen oder gar korrigieren kann.


  • Mod

    plantplant schrieb:

    neues element von stack erzeugen? eine instanz von Stack?

    Bitte benutze ganze Sätze. Ich weiß nicht, was du wissen möchtest. Kennst du die Begriffe der objektorientierten Programmierung nicht? Oder weißt du nicht, wie du diese Konzepte in C* umsetzen kannst? Oder ganz was anderes?

    *: Falls du dir dessen nicht bewusst bist: Auch wenn du gerade im C++-Forum fragst, so ist dein Code doch typisches C, mit einer einzigen (unnötigen) Zeile C++. Sogenanntes "C mit cout". In C++ würde man Objektorientierung ganz anders umsetzen, da sie direkt von der Sprache her unterstützt wird und du dir das ganze create, destroy und Pointergefummel sparen kannst (oder man nimmt den Stack aus der Standardbibliothek, aber ich kann durchaus nachvollziehen, dass man das vielleicht einmal selber programmieren sollte. Aber wie gesagt, in C++ ginge das ganz anders).



  • plantplant schrieb:

    danke für die hilfe aber mir fehlt es eher an werkzeug.

    neues element von stack erzeugen? eine instanz von Stack?

    mfg

    Weisst du wie man in C (bzw. C++ - je nachdem was es denn werden soll) Speicher anfordert?



  • Ja bei c++ mit "new", wobei ich dann doch auf den heap zugreife, in der Aufgabe es doch aber um den stack geht?!

    Die Vorlesung behandelt c++, ich muss eben versuchen die Aufgabe so c++-typisch wie möglich zu lösen ohne das vorgegeben zu verändern. Ich bin zum einen von diesem Zeigergefummel wie du schon gesagt hast, durcheinander, und zum anderen weiß ich nicht mit welchen Operatoren ich hier ansetzen soll.

    mfg


  • Mod

    plantplant schrieb:

    Ja bei c++ mit "new", wobei ich dann doch auf den heap zugreife, in der Aufgabe es doch aber um den stack geht?!

    Du bringst da ein paar Sachen durcheinander.
    Heap
    Heap
    Stack
    Stack
    Du sollst hier die Datenstruktur "Stack" implementieren.

    In C++ benutzt man übrigens so gut wie nie new, zumindest keines, das nicht sehr gut versteckt ist.



  • Ich dreh mich im Kreis...

    Ich kann doch struct wie eine Klasse behandeln oder?

    und bräuchte ich nicht 3 dateien? eine main.cpp eine stack.h und eine stack.cpp. Ich bin mir gerade doch unsicher wo ich die funktionen überhaupt definieren soll...



  • #include <iostream>
    
    using namespace std;
    
    struct Person {
      int age;
    };
    
    Person* create_person1(int age);
    Person* create_person2(int age);
    Person create_person3(int age);
    
    int main() {
    	struct Person *emil = create_person1(15);
    	struct Person *paul = create_person2(16);
    	struct Person lisa = create_person3(17);
    
    	cout<<"Emils Alter: ";
    	cout<<emil->age<<endl;
    	cout<<"Pauls Alter: ";
    	cout<<(*paul).age<<endl;
    	cout<<"Lisas Alter: ";
    	cout<<lisa.age<<endl;
    
    	return 0;
    }
    
    struct Person* create_person1(int age) {
    	struct Person *newPerson;
    	newPerson->age = 15;
    
    	return newPerson;
    }
    
    struct Person* create_person2(int age) {
    	struct Person *newPerson;
    	(*newPerson).age = 15;
    
    	return newPerson;
    }
    struct Person create_person3(int age) {
    	struct Person newPerson;
    	newPerson.age = 15;
    
    	return newPerson;
    }
    

    5 min gegoogled. 3 Möglichkeiten gefunden ein Element von Struct zu erzeugen.
    Der Code ist nicht getestet und da ich selbst grade erst mit C++ anfange wird er vermutlich auch nicht laufen 🤡
    Aber so in etwa wird es funktionieren.

    Und lass das alles erstmal in einer Datei. Auslagern kannst du später immer noch.

    Scheint auch C mit cout zu sein. Kann ich leider noch nicht so ganz beurteilen 🙂



  • Was für ein Scheiß...


  • Mod

    n3wbie, es ist ja sehr löblich, dass du als Anfänger auch selber über Fragen nachdenkst. Aber wenn du helfen willst, dann sei dir bitte halbwegs sicher, ob deine Antwort auch stimmt. Wenn du selber sagst, dass du dich nicht auskennst und du nicht einmal den Code getestet hast, dann ist deine Antwort sehr wahrscheinlich nicht richtig. In der Tat ist genau das passiert: Alle drei von deinen Versionen gehen entweder voll am Thema vorbei oder sind schlichtweg falsch. Und zwar richtig schlimm falsch, nicht bloß schlecht.

    Ich muss leider sagen, dass dies bei vielen deiner Antworten der Fall ist, nicht nur in diesem Thread.


Anmelden zum Antworten