Stack programmieren - Hilfe
-
Guten Tag,
habe folgende Aufgabe erhalten:
*Programmieren Sie einen Stapel (Stack) für Ganzzahlwerte (int). Stapel bedeutet, das
zuletzt eingefügte Element wird zuerst entfernt. Verwenden Sie ein int Feld konstanter
Länge. Beginnen Sie mit dem Einfügen an der Position 0 des int Feldes. Eine Variable zur Verwaltung der aktuellen Anzahl Elemente im Stack genügt. Dadurch ist die
Einfügeposition und das als erstes heraus zu nehmende Element bestimmt.Benutzen Sie folgendes Menue:
i - insert entry
d - delete entry
c - clear (delete all entries)
p - print all entries*Bis jetzt habe ich folgendes:
#include <iostream> #include <stack> using namespace std; void menue(void); void eingabe(void); void einf(void); void loe(void); void clear(void); void ende(void); void zeige(void); char x; int stack[20], pos=0, wert, i; int main() { /*string name; cout << "Ihr Name: "; cin >> name; cout << "Hallo " << name << endl;*/ do{ menue(); eingabe(); } while(char(x)!='e'); return 0; } void menue(void) { cout<<" Bitte waehlen Sie aus: "<<"\n"; cout<<" i - Eintrag hinzufuegen "<<"\n"; cout<<" d - loesche Eintrag "<<"\n"; cout<<" c - Loesche alle Eintrarge "<<"\n"; cout<<" p - Zeige alle Eintraege "<<"\n"; cout<<" e - Verlassen "<<"\n"; cout<<" Eingabe erwartet: "; cin>>x; } void eingabe(void) { switch(x) { case 'i' : einf();break; /*case 'd' : loe();break; case 'c' : clear();break; case 'p' : zeige();break; case 'e' : ende();break;*/ default : cout << "Falsche Eingabe" << endl;break; } } void einf(void) { if(pos<=19) { cout<<" Bitte einen Wert beliebigen Wert eingeben: "; stack[pos]=wert; // [b]Error hier : Reference to Stack is ambiguous[/b] cout<<" Wert <<< "<<wert<<" >>> auf Position <<< "<<pos<<" >>> hinzugefuegt. "<<"\n"; pos++; } else { cout<<" >>> Die Liste ist voll <<< "<<"\n"; } }
-
C oder C++? Denn das ist C mit cout <<. Du liest nicht zufällig C++ von A bis Z?
(Und zum Fehler: Wenn das mal nicht lustig ist, namespace Auflösung war so wohl nicht geplant. Es gibt schon eine Klasse die stack heißt, benenn deine Variable um. Oder mach sie lokal. Was soll das eigentlich mit den globalen Variablen? oO)
-
-
Warum formulierst du keine Frage?
Warum gibt es ein include für stack (und auch noch ein using namespace std), wenn du doch selber einen Stack implementierst?
-
Lies doch mal die Fehlermeldung komplett. Steht da nicht noch mehr? sowas wie "could be int stack[10] or std::stack"
Ich mein die Aufgabe ist durch Zeile 2 schon ziemlich cool gelöst, aber ich denke damit kommst du nicht durch. Also erstmal #include <stack> raus, dann ist die Mehrdeutigkeit schon weg. Oder das globale using namspace std, das ist auch nicht gut. Damit wäre stack auch wieder eindeutig. Oder du benennst deinen Stapel anders. Und dann würde ich noch vorschlagen das ganze etwas ordentlicher zu machen.
class Stapel { public: Stapel() : anzahl_(0) { } void Einfuegen(int element) { // ... } void LetztesElementEntfernen() { // ... } int& LetztesElement() { if (anzahl_ == 0) throw std::out_of_range("Stack ist leer!"); return elemente_[anzahl_ - 1]; } int LetztesElement() const { // ... } private: int elemente_[10]; size_t anzahl_; }; int main() { Stapel stapel; stapel.Einfuegen(1); stapel.LetztesElementEntfernen(); }
Oder halt etwas vergleichbares in C, wenn das ein C Kurs ist. Dann bist du aber auch im falschen Forum.
-
OPTIMUS schrieb:
p - print all entries
lol fail
-
Bitte weg mit der Exception. Die paßt nicht zu C++.
-
Er deklariert/definiert
int stack[10];
dadurch gereät er nicht in Konflikt mit std::stack.
-
volkard schrieb:
Bitte weg mit der Exception. Die paßt nicht zu C++.
Dann brauchst aber zumindest noch eine öffentliche
bool IstLeer() const;
Methode.
-
brotbernd schrieb:
volkard schrieb:
Bitte weg mit der Exception. Die paßt nicht zu C++.
Dann brauchst aber zumindest noch eine öffentliche
bool IstLeer() const;
Methode.Ja, die wäre nett.
Dann könnte man schreibenwhile(!s.IstLeer()){ tuwasMit(s.LetztesElement()); s.LetztesElementEntfernen(); }
statt
try{ for(;;){ tuwasMit(s.LetztesElement()); s.LetztesElementEntfernen(); } }catch(std::out_of_range& e){ if(s.what()!="Stack ist leer!")//Bug. Es muß nicht s gewesen sein, der warf, sondern throw; //es könnte auch von einem Programmierfehler in tuwasMit kommen. }
edit: Doch möglich. Achtung, er folgt javaesker Code. Das ist nichts für schwache Nerven.
Spoiler
Und gelöst hat der Code gar nichts: s muß trotzdem nicht den Fehler ausgelöst haben, es kann immernoch ein anderer Programmierfehler sein, der jetzt nur meine Schleife beendet, die sich eh gleich selber beendet hatte und ich verstecke damit einen fremden Programmierfehler.Oder so machen:
Spoiler
-
Es lag am "#include <stack>
Danke für die Antworten
-
OPTIMUS schrieb:
Es lag am "#include <stack>
Danke für die Antworten
Na super, das war so ziemlich die schlechteste Reaktion die von dir kommen konnte.
-
jop richtige reaktion
es lag am include <stack> oder am using namespace std; jenachdem wie mans nimmt