// La misma pila, sobre std::vector. Otra implementación del mismo tipo abstracto.
#ifndef VECTOR_STACK_H
#define VECTOR_STACK_H

#include <cassert>
#include <cstddef>
#include <utility>
#include <vector>

// No declara ninguna de las cinco funciones: std::vector ya se encarga (regla de cero).
template <typename T>
class VectorStack {
public:
    void push(T value) {
        items_.push_back(std::move(value));
    }

    void pop() {
        assert(!empty());
        items_.pop_back();
    }

    T& top() {
        assert(!empty());
        return items_.back();
    }

    bool empty() const {
        return items_.empty();
    }

    std::size_t size() const {
        return items_.size();
    }

    // Sin invariantes propios: cualquier estado de items_ es una pila válida.
    void check_invariants() const {}

private:
    std::vector<T> items_;
};

#endif
