#include <iostream>

template <class T>
class Stack_Class{
public:
    T* stack;
    int item_quantity;
    T* First_item;
    int Max_quantity;

    Stack_Class(int value); 
    ~Stack_Class();
    bool Add(T value);
    T Pop();
    int GetMax_Quantity();
    bool Full();
    bool Empty();   
};


template <class T>
Stack_Class<T>::Stack_Class(int value){
    if (value > 0){
        stack = new T[value];
        First_item = stack;
        item_quantity = 0;
        Max_quantity = value;
    }
}

template <class T>
Stack_Class<T>::~Stack_Class(){
    if (First_item){
        delete First_item;
    }
}



template<class T>
bool Stack_Class<T>::Add(T num){
    if (item_quantity <Max_quantity){       

        stack[item_quantity++] = num;
        return true;
    }
    else return false;
}

template<class T>
T Stack_Class<T>::Pop(){
    if (!Empty()){
        item_quantity--;
        return stack[item_quantity];
    }
     return 0;
}

template<class T>
bool Stack_Class<T>::Empty(){
    return (item_quantity == 0);
}

template <class T>
int Stack_Class<T>::GetMax_Quantity(){
    return Max_quantity;
}

int main(){    
    Stack_Class<int> intStack(3);

    intStack.Add(1);
    intStack.Add(2);
    intStack.Add(3);
    int count = intStack.GetMax_Quantity();

    for (int i = 0; i < count; i++){
        std::cout << "Pop No: " << i << " - Elemento: "  << intStack.Pop() << std::endl;
    }
    return 0;
}
