Aufgabe: zu Lifo -Stack
-
Dravere schrieb:
krümelkacker schrieb:
Außerdem, missbrauchst Du Vererbung.
Merkt euch es mal, c.groupe ist der mit dem Professor, welcher man löschen (verbrennen) sollte

Das soll c.groupe mal in seine Signatur aufnehmen.
Außerdem war neulich sein Prof nur 20 Jahre hintendran, das Erben von stack war niemals vernünftig, fürchte ich.
-
gut ich schreibe mal LIFO neu und lasse es LIFO mit FIFO zu verbinden

-
Alter Version: nach der Aufgabe
/* * Lifo-Stack.cpp * * Created on: 07.02.2010 * Author: c.goupe */ #include <iostream> using namespace std; class stack{ private: int anzahl; int size; int top; int* stck; public: // Konstruktoren stack(int groesse = 16) { stck = new int[groesse]; size = groesse; top = 0; } stack(const stack & s) { anzahl = s.anzahl; stck = new int [anzahl]; for( int i=0; i<anzahl; ++i ) stck[i] = s.stck[i]; } ~stack() { delete[] stck; } void push(int wert) { if (top == size) resize(size*2); stck[top] = wert; ++top; } int pop() { int erg = 0; if (top > 0) { --top; erg = stck[top]; } else cerr << "Fehler in pop: Stack ist leer!\n"; return erg; } void resize(int newsize){ int *Speicher, i; Speicher = new int [newsize]; for( i=0; i<anzahl; ++i ) Speicher[i] = stck[i]; delete [] stck; stck = Speicher; size = newsize; } }; int main() { int a; stack s; cout << "LIFO-Stack!"; cout << "Push: "; cin >> a; s.push(a); cout << "Pop: " << s.pop() << endl; return 0; }Neue Version:
/* * Lifo-Stack(verbessert).cpp * * Created on: 07.02.2010 * Author: c.groupe */ #include <iostream> using namespace std; // LIFO-Stack class Stack { public: Stack(int groesse = 16){ itsStack = new int[groesse]; itsSize = groesse; itsTop = 0; } ~Stack() { delete[] itsStack; } void Push(int wert); int Pop(); void Resize(int newsize); // void setSize( int size ) { itsSize = size; } // void setTop( int top ) { itsTop = top; } // void setStack( int* stack ) { itsStack = stack; } int getSize() const { return itsSize; } int getTop() const { return itsTop; } int getStack() const { return* itsStack; } protected: int itsSize; int itsTop; int* itsStack; }; void Stack::Push(int wert) { if ( getTop() == getSize() ) Resize(getSize()*2); itsStack[getTop()] = wert; ++itsTop; } int Stack::Pop() { int erg = 0; if ( getTop() > 0) { --itsTop; erg = itsStack[getTop()]; } else clog << "Fehler in Pop: Stack ist leer!\n"; return erg; } void Stack::Resize(int newsize) { int *Speicher; Speicher = new int [newsize]; for ( int i=0; i<getTop(); ++i) Speicher[i] = itsStack[i]; delete [] itsStack; itsStack = Speicher; itsSize = newsize; } int main () { Stack mystack; cout << "0. top: " << mystack.getTop() << endl; for (int i=0; i<20; i++) mystack.Push(i); cout << "1. top: " << mystack.getTop() << endl; for (int i=0; i<11; i++) mystack.Pop(); cout << "2. top: " << mystack.getTop() << endl; mystack.Push(10); mystack.Push(20); cout << "mystack.getTop() is now " << mystack.getTop() << endl; return 0; }besser ?

-
so und hier mal ein FIFO,
ich weiss nur nicht wie ich am bestern resize in push noch unterbringen soll.
und mit set klappt auch nichts
/* * Fifo-Stack(ordentlich).cpp * * Created on: 07.02.2010 * Author: c.groupe */ #include <iostream> using namespace std; // FIFO-Stack class Stack { public: Stack(int groesse = 3){ itsStack = new int[groesse]; itsSize = groesse; itsTop = 0; itsBottom = -1; } ~Stack() { delete[] itsStack; } void Push(int wert); int Pop(); void Resize(int newsize); // void setSize( int size ) { itsSize = size; } // void setTop( int top ) { itsTop = top; } // void setStack( int* stack ) { itsStack = stack; } int getSize() const { return itsSize; } int getTop() const { return itsTop; } int getStack() const { return* itsStack; } int getBottom() const { return itsBottom; } protected: int itsSize; int itsTop; int itsBottom; int* itsStack; }; void Stack::Push(int wert) { if ( getTop() != getBottom() ) { itsStack[getTop()] = wert; if ( getBottom() == -1 ) itsBottom = itsTop; itsTop = (getTop() + 1) % getSize(); } } int Stack::Pop() { int erg = -1; if ( getBottom() != -1 ) { erg = itsStack[getBottom()]; itsBottom = ( getBottom() +1 ) % getSize(); if ( getBottom() == getTop() ) itsBottom = -1; } else clog << "Fehler in Pop: Stack ist leer!\n"; return erg; } void Stack::Resize(int newsize) { int *Speicher; Speicher = new int [newsize]; for ( int i=0; i<getTop(); ++i) Speicher[i] = itsStack[i]; delete [] itsStack; itsStack = Speicher; itsSize = newsize; }