
export module Stack;

// Klassendefinition
export class Stack
{
    short *ptrStack;        // Zeiger auf Stack
    short stackPtr = 0;     // Stackindex
    short stackSize;        // Stackgroesse
 public:
    explicit Stack(int s=10);   // ctor, Standard-Stackgroesse 10
    ~Stack();                   // dtor
    bool Push(const short val); // Wert auf Stack ablegen
    bool Pop(short& val);       // Wert vom Stack holen
};
// Definition der Memberfunktionen
// Konstruktor
Stack::Stack(int s)
{
    ptrStack = new short[s]; // Datenfeld reservieren
    stackSize = s;           // Groesse merken
}
// Destruktor
Stack::~Stack()
{
    delete [] ptrStack; // Stackbereich freigeben
}
// Wert auf Stack ablegen
bool Stack::Push(const short val)
{
    auto retval = false;        // Returncode
    if (stackPtr < stackSize)   // Falls Stack noch nicht voll
    {
        ptrStack[stackPtr] = val;  // Wert ablegen
        stackPtr++;                // Stackindex erhoehen
        retval = true;             // OK zurückgeben
    }
    return retval;
}
// Wert vom Stack holen
bool Stack::Pop(short& val)
{
    auto retval = false;    // Returncode
    if (stackPtr>0)         // Falls noch Werte auf dem Stack
    {
        stackPtr--;                // Stackindex vermindern
        val = ptrStack[stackPtr];  // Wert zurueckgeben
        retval = true;             // OK zurückgeben
    }
    return retval;
}
