#include <iostream>
#include <memory>

using namespace std;

template <typename T>
class StackNode{
public:
    T data_{};
    std::unique_ptr<StackNode<T>> next_;

    explicit StackNode(const T& data_) : data_(data_),next_(nullptr) {}

};
template <typename T>
class Stack{
private:

    std::unique_ptr<StackNode<T>> top_;
    std::size_t size_{};

public:
    Stack() : top_(nullptr), size_ (0){}
    void push(const T& item){
        std::unique_ptr<StackNode<T>> p = std::make_unique<StackNode<T>>(item);
        p->next_ = std::move(top_);
        top_ = std::move(p);
    }

    T pop(){
        T p = top_->data_;
        top_ = std::move(top_->next_);
        return p;
    }

    T peek(){
        return top_->data_;
    }

};

int main() {
	
	Stack<int> stack{};
	stack.push(12);
	stack.push(13);
	std::cout << stack.peek() << std::endl;
	stack.pop();
	std::cout << stack.peek() << std::endl;
	
	return 0;
}