Não sei se na sua faculdade permite usar new/delete e classes. Mas vou usar a minha de base. Normalmente fazemos assim:
template <typename T>
class Node {
friend class stack;
private:
Node* next;
T value
public:
Node(T new_value) {
next = NULL;
value = new_value;
}
}
template <typename T>
class Stack {
private:
Node<T>* top;
public:
Stack(){
top = NULL;
}
T pop() {
if (topo == nullptr) {
std::cout << "Pilha vazia!" << std::endl;
return T();
}
Node<T>* temp = this->top;
T aux = temp->value;
top = top->next;
delete temp;
return aux;
}
void push(T new_value) {
Node<T>* new_node = new Node<T>(new_value);
new_node->next = this->top;
this->top = new_node;
}
}