module;
#include <stdexcept>
#include <format>

export module Stack;
// Definition der Klasse Stack
constexpr int SIZE = 100;

export class Stack
{
     short stackPtr;    // Stackindex (Stackpointer)
     short size;        // Stackgroesse
     short *pData;      // Zeiger auf Stack
  public:
     Stack(const short s);
     ~Stack();
     void Push(const short val);
     short Pop();
};
// Definition der Memberfunktionen
// Konstruktor
Stack::Stack(const short s)
{
    // Falls Stack mehr als 100 Elemente, Ausnahme auslösen
    if (s > SIZE)
    {
        auto err = std::format("Maximale Stackgroesse von {} ueberschritten!\n", SIZE);
        throw std::length_error(err);
    }
    // Feld für Stackdaten anfordern
    // Wirft eventl. bad_alloc Ausnahme
    pData = new short[s];
    // Stackparameter merken
    size = s;
    stackPtr = 0;
}
// Destruktor
Stack::~Stack()
{
    delete [] pData;
}
// Legt Datum auf dem Stack ab
void Stack::Push(const short val)
{
    // Falls Stack schon voll ist
    if (stackPtr == size)
        throw std::out_of_range("Stack belegt!\n");
    // Datum ablegen
    pData[stackPtr++] = val;
}
// Liest Datum vom Stack aus
short Stack::Pop()
{
    // Falls Stack leer
    if (stackPtr==0)
        throw std::out_of_range("Stack leer!\n");
    // Datum holen
    return pData[--stackPtr];
}
