Frage zu Stack



  • hi

    ich habe tausende inet seiten durchgeschaut und in nem buch gelesen aber ich kapier nicht was es mit dem stack auf sich hat

    ist das wie eine SESSION in php oder eine ansammlung von variablen??
    oder auch was ganz anderes? 😕

    und mit pop() und push() kapier ichs auch net.

    am besten einfach am volgenden code erklären, was gemact wird... wäre echt nett

    namespace Stack{
    void push(char);
    char pop();}
    
    void f(){
    Stack::push('c');
    if(Stack::pop() != 'c') error("unmöglich");
    }
    


  • bammes schrieb:

    hi

    ich habe tausende inet seiten durchgeschaut und in nem buch gelesen aber ich kapier nicht was es mit dem stack auf sich hat

    ist das wie eine SESSION in php oder eine ansammlung von variablen??
    oder auch was ganz anderes? 😕

    und mit pop() und push() kapier ichs auch net.

    am besten einfach am volgenden code erklären, was gemact wird... wäre echt nett

    namespace Stack{
    void push(char);
    char pop();}
    
    void f(){
    Stack::push('c');
    if(Stack::pop() != 'c') error("unmöglich");
    }
    

    Der Code ist schlecht und hat nichts mit üblichen Stack zu tun. Schnapp Dir erst mal ein Buch oder Tutorial.



  • hab mir n buch geschnappt 🙂
    "Die C++ Programmiersprache"



  • bammes schrieb:

    hab mir n buch geschnappt 🙂
    "Die C++ Programmiersprache"

    Fein. Dann finde raus, wie mein Programm funktioniert.

    #include <stack>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	stack<int> st;
    	int eingabe;
    	while (cin>>eingabe && eingabe!=0)
    		st.push(eingabe);
    	while (!st.empty())
    	{
    		cout<<st.top()<<'\n';
    		st.pop();
    	}
    	return 0;
    }
    


  • Stack ist englisch für Stapel. push() fügt ein Element hinzu, pop() entfernt es wieder wenn man es abfragt. Sehr geeignet als bsp für Kartenspiele. Karten mischen und dann auf einen Stack legen. So kann man einfach die nächste Karte holen ohne sich drum kümmern zu müssen ob diese schon im Spiel ist.
    rya.



  • achso also eine sammlung von werten ^^

    gut das war die frage

    und ich hab kp was des fürn code ist

    denke des verlangt irgendeine eingabe und füht s in nen stack hinzu
    stimmt das?



  • Probier's doch mal aus.



  • hab ich ja schon aber es gibt nichts aus^^ sondern schließt gleich nach eingabe



  • bammes schrieb:

    hab ich ja schon aber es gibt nichts aus^^ sondern schließt gleich nach eingabe

    Schade. Er sollte so lange Zahlen einlesen, bis man eine 0 eingibt, und dann die Zahlen außer der 0 wieder ausgeben, und zwar in umgekehrter Reihenfolge.



  • oke hab am schluss noch cin eingefügt und da sieht man dass die zahl davor gespeichert wird.

    aber dafür gibts ja auch variablen die gehen doch auch dafür



  • oke habs so probiert wies du gesagt hat und es stimmt
    ^^ hab buchstaben eingegeben ^^

    aber dafür gibts ja variablen und arrays



  • Sind Stacks etwa keine Variablen?



  • ne ich meinte "normale" variabeln wie int name; is doch des gleiche nur weniger schreiben



  • Du kannst in einen Stack mehr als einen Integer stapeln.

    Ein Stack (Stapel, manchmal auch "Keller" genannt) ist eine sog. LIFO-Datenstruktur (LIFO = last in, first out). Du kannst mehrere Werte reinstopfen und sie in umgekehrter Reihenfolge wieder auslesen.

    Praktisches Beispiel: Undo/Redo.

    #include <iostream>
    #include <sstream>
    #include <stack>
    #include <string>
    
    int main() {
      std::string line;
      std::stack<double> undo_stack;
      std::stack<double> redo_stack;
      double sum = 0.0;
    
      while(true) {
        std::cout << "Zahl, undo, redo, exit? " << std::flush;
        std::getline(std::cin, line);
    
        if(line == "exit") {
          break;
        } else if(line == "undo" && !undo_stack.empty()) {
          redo_stack.push(sum);
          sum = undo_stack.top();
          undo_stack.pop();
        } else if(line == "redo" && !redo_stack.empty()) {
          undo_stack.push(sum);
          sum = redo_stack.top();
          redo_stack.pop();
        } else {
          std::istringstream parser(line);
          double x;
    
          if(parser >> x) {
            while(!redo_stack.empty()) {
              redo_stack.pop();
            }
    
            undo_stack.push(sum);
            sum += x;
          }
        }
    
        std::cout << "Summe: " << sum << std::endl;
      }
    }
    

    Üblicherweise besteht der Zustand in einer solchen Historie natürlich aus mehr als nur einer Zahl.

    Ansonsten brauchen viele Algorithmen in irgendeiner Form einen Stack. Spontan fällt mir der Shunting-Yard-Algorithmus zum Lösen von Infix-Ausdrücken ein, aber im Grunde trifft das auf alles zu, was eine Stapelmaschine braucht.



  • achso

    thx kapiert wozu man das braucht.

    weis einer noch zufällig ne seite wos genau erklärt wird?



  • Du hast doch das Buch "Die C++ Programmiersprache" von Bjarne Stroustrup, wie du geschrieben hast.
    Eine Referenz ist zwar auch hier zu finden (http://www.cplusplus.com/reference/stl/stack/, in deinem Buch ist doch ab Seite 505 (4. Auflage) alles gut beschrieben.

    Edit: 4., nicht 5. Auflage

    Edit 2: Ich sehe gerade, das Beispiel des Stacks, welches du beschrieben hast, ist wirklich in dem Buch zu finden, allerdings auf Seite 29 im Kapitel "Eine Rundreise durch C++".
    Stroustrup wollte hier aber auch nur generelle Dinge wie den Gebrauch von namespaces zeigen.

    Edit 3 (einer muss noch sein): Nimm dir den ersten Ratschlag Stroustrups zu Herzen (für alle, die das Buch nicht kennen, er lautet "Nur keine Panik, mit der Zeit wird alles klarer.")
    LG Hendrik



  • oh thx^^^^

    hab zwar 3. auflage aber da wirds auch beschrieben.



  • @bammes: ich habe das unbestimmte Gefühl, dass Du völlig falsche Bücher liest. Du solltest einfacher und grundlegender anfangen.

    Wie ein Stack (Stapel) funktioniert, dürfte dir inzwischen klar sein:
    http://upload.wikimedia.org/wikipedia/commons/2/29/Data_stack.svg
    http://www.cosc.canterbury.ac.nz/mukundan/dsal/StackAppl.html (geht nix über praktisches Visualisieren)

    "push" legt Daten oben drauf, "pop" holt die zuletzt darauf gelegten Daten wieder ab. Das nennt man LIFO = Last in first out.

    Aber wozu man einen Stack benötigt, ist dir offenbar noch nicht klar.

    Geh mal folgendermaßen vor:
    Wozu benötigt man in Programmen einen Stack und einen Heap (malloc/free bzw. new/delete)?
    Was ist ebp und esp? http://www.henkessoft.de/OS_Dev/Bilder/Register386.png
    Was ist ein buffer overflow? http://de.wikipedia.org/wiki/Pufferüberlauf



  • Was ist ebp und esp? http://www.henkessoft.de/OS_Dev/Bilder/Register386.png
    Was ist ein buffer overflow? http://de.wikipedia.org/wiki/Pufferüberlauf

    Das wird im sicherlich helfen... 🙄

    Das Problem sind nicht die Bücher, sondern dass er sie nicht gründlich genug liest oder/und sich die Zeit nimmt sie zu verstehen. "Die C++ Programmiersprache" ist ein sehr gutes Buch, wo alles wirklich genau beschrieben wird - vielleicht zu genau für einen Anfänger, weswegen ich eher den "C++ Primer" oder "Der C++ Programmierer" empfehlen würde.



  • thx werde mir deine fragen durchlesen

    problem: ganz am anfang fangen die mit stacks an obwohl es erst bei der hälfte richtig erklärt wird


Anmelden zum Antworten