stack in C++
-
Bereits 23:22 Uhr schrieb:
Ist doch völlig sinnlos, außer du willst dir einen kleinen Parser bauen, der zusammengesetzte Ausdrücke auflöst.
Das ein Stackrechner nicht besonders sinnbringend ist weiß ich auch, aber das ist nun mal die Aufgabe...
Wie kommst du jetzt bitte auf einen Parser???
-
Ach, egal.
Hier kannst du nachlesen, wie man mit std::stack arbeitet:
http://cppreference.com/cppstack/index.html
-
ok, das ist schon klar aber das muss mit push auf einem Stack abgelegt werden, mit pop wieder geholt werden usw...
DAS ist völlig sinnlos. Oder was willst du mache? Nix mit Stack.
Einen Parser brauchst du, wenn du was komplizierteres machen willst..
-
drakon schrieb:
ok, das ist schon klar aber das muss mit push auf einem Stack abgelegt werden, mit pop wieder geholt werden usw...
DAS ist völlig sinnlos. Oder was willst du mache? Nix mit Stack.
Einen Parser brauchst du, wenn du was komplizierteres machen willst..Nochmal: Ich weiß das es sinnlos ist, ich mach das auch nicht zum Spaß am Samstag um 23:46, sondern das ist die Aufgabenstellung!
-
Würdest du für mich die Aufgabenstellung mal zitieren? Verstehe das bisher nicht wirklich.
-
Bereits 23:52 schrieb:
Würdest du für mich die Aufgabenstellung mal zitieren? Verstehe das bisher nicht wirklich.
Die aufgabenstellung geht über eine ganze Seite, man soll im allgemeinen einen Stack Rechner in ein Command-Design Pattern einbauen. Aber das kommt erst später. Zuerst sollt ich mal rausfinden, wie das ganze ohne Design-Pattern funktioniert.
PS: Danke, dass du mich immer an die Uhrzeit erinnerst
:p
-
Ganz rudimentär das, was ich bis jetzt verstehe, was du willst:
int nr1,nr2; char c; std::cin >> nr1; std::cin >> nr2; std::cin >> c; switch (c) { case '+': std::cout << nr1+nr2; break; case '-': std::cout << nr1-nr2; break; case '/': std::cout << nr1/nr2; break; case '*': std::cout << nr1*nr2; break; default: std::cout << 0; }
-
Ok, danke mal. Das hätt ich selber auch noch zusammengebracht. Also nochmal: Die zwei zahlen, sollen auf einen von mir angelegten Stack (Stapel) gelegt werden. Zuerst Zahl1, dann Zahl2.
Dann: soll ein Operator eingegeben werden, also +,-,* oder / und dann soll die zahl1 mit der zahl2 entweder addiert, subtrahiert, multipliziert oder dividiert werden.
Lg
-
std::stack<int> st; int nr; int out; char c; std::cin >> nr; st.push (nr); std::cin >> nr; st.push (nr); std::cin >> c; switch (c) { case '+': out = st.top (); st.pop (); out += st.top (); std::cout << out; break; case '-': out = st.top (); st.pop (); out -= st.top (); std::cout << out; break; case '/': out = st.top (); st.pop (); out /= st.top (); std::cout << out; break; case '*': out = st.top (); st.pop (); out *= st.top (); std::cout << out; break; default: std::cout << "Falsche Eingabe."; }Wo ist das Problem? Oder musst du den Stack implementieren?!
-
Afaik funktioniert ein Stack-Rechner nach folgendem Prinzip: Wenn eine Operation ausgeführt werden soll, werden die entsprechenden Operanden vom Stack geholt und das Ergebnis wieder reingepusht.
Also etwa so:stack<int> stapel; while irgendwas eingegeben wird: eingabe = lese_benutzereingabe() if eingabe ist eine zahl: stapel.push( eingabe als zahl ) else if eingabe ist '+': stapel.push( stapel.get_and_pop() + stapel.get_and_pop() ) else if ( eingabe ist '*': stapel.push( stapel.get_and_pop() * stapel.get_and_pop() ) usw..e1: Oh Mist, 3 Minuten zu spät..
e2: Dafür wird bei meinem Stack-Rechner das Ergebnis wieder zurückgepusht :p Aso, und das Ergebnis ist dann am Schluss immer das oberste Stack-Element.
-
drakon schrieb:
Ganz rudimentär das, was ich bis jetzt verstehe, was du willst:
und wo ist der stack? die antworten im cpp forum sind mal wieder absolute grütze.
@OP: fang erstmal damit an:int stack[256]; int stackptr = 0; #define push(x) stack[stackptr++]=(x) #define pop() stack[--stackptr]ist zwar auch nicht das gelbe vom ei (keine bereichsüberprüfung und so), aber wenigstens das grundgerüst eines stacks ist da.

-
stack-freak schrieb:
@OP: fang erstmal damit an:
int stack[256]; int stackptr = 0; #define push(x) stack[stackptr++]=(x) #define pop() stack[--stackptr]Im C-Forum wäre das evtl ok, hier gibt's aber zum Glück std::stack..
-
Badestrand schrieb:
Im C-Forum wäre das evtl ok, hier gibt's aber zum Glück std::stack..
du glaubst doch wohl nicht im ernst, dass jemand der fragt:
kann mir schnell mal jemand erklären, man mit einem Stack richtig "umgeht"? Ich muss bis morgen einen Stack-Rechner für die Uni programmieren, hab leider noch nicht so wirklich einen Plan davon...
mit std::cpp_frickeltemplate in kürzester zeit umgehen kann?

-
mit std::cpp_frickeltemplate in kürzester zeit umgehen kann?
$
std::stack ist 1000 mal einfacher, als das, was du da oben gemacht hast und netterweise ist es auch noch sicherer..
-
was haltet ihr von containerklassen?
-
drakon schrieb:
std::stack<int> st; int nr; int out; char c; snip snap std::cout << "Falsche Eingabe."; }Wo ist das Problem? Oder musst du den Stack implementieren?!
HEy super das war das was ich gesucht habe, danke. Eine Frage jetzt noch: bei der eingabe 5,6, - kommt als ergebnis 1 raus... wo ist das vorzeichen?
danke & lg
-
Bist du sicher, dass du nicht 5 von 6 subtrahierst? Überprüf das doch mal, indem du die Operanden in umgekehrter Reihenfolge eingibst. Wie sieht denn dein Code im Moment aus?
Du hast ja kaum aus Versehen eine Funktion für den Betrag eingebaut, oder?
-
Nexus schrieb:
Bist du sicher, dass du nicht 5 von 6 subtrahierst? Überprüf das doch mal, indem du die Operanden in umgekehrter Reihenfolge eingibst. Wie sieht denn dein Code im Moment aus?
Du hast ja kaum aus Versehen eine Funktion für den Betrag eingebaut, oder?
Mein Code steht doch da.

Und er hat das schon richtig eingegeben.

Nur wird hald von oben nach nach unten gerechnet. Müsstest das einfach noch umschreiben. Wie gesagt, ich habe das nicht gross getestet, war gestern mit Film schauen beschäftig.
Vieles ist ja eh noch unelegant, aber sollte ja kein Problem sein das zu ändern..Badestrand schrieb:
e2: Dafür wird bei meinem Stack-Rechner das Ergebnis wieder zurückgepusht :p Aso, und das Ergebnis ist dann am Schluss immer das oberste Stack-Element.
DAS ist ja wohl kein Problem auch noch zu implementieren.

Wollte ihm nur schnell helfen. Den Rest kann man ja noch in 5 Minuten dran rumbasteln.
-
Hey, people!
It very fun that you do not know what is "Stack-Rechner"

Old Soviet microcalculators were stack-based (I'm from Russia). That means that if you want to calculate the expression (2+3)*(4+5) then you should enter in calculator the following:
[user enters] [action of calculator] [stack state] 2 Push 2 to stack 2 3 Push 3 to stack 2 3 + Pop 3, than 2 from stack, add them, push result back 5 4 Push 4 to stack 5 4 5 Push 5 to stack 5 4 5 + Pop 5, than 4 from stack, add them, push result back 5 9 * Pop 9, than 5 from stack, multiply them, push result 45The top of the stack is always displayed on the screen, so you got the answer 45.
The "Stack-Rechner" does not need in brakets (). The modern calculators translate the commands you enter on-the-fly to stack commands.
-
Nexus schrieb:
Bist du sicher, dass du nicht 5 von 6 subtrahierst? Überprüf das doch mal, indem du die Operanden in umgekehrter Reihenfolge eingibst. Wie sieht denn dein Code im Moment aus?
Du hast ja kaum aus Versehen eine Funktion für den Betrag eingebaut, oder?
stimmt, jetzt ist alles klar...
