#include <deque>
#include <vector>
#include <iostream>
using namespace std;

template <class T, template <class> class CONT = std::deque >
class stack {
private:
    CONT<T> elems;
public:
    void push ( T const & );
    void pop();
    T top() const;
    bool empty() const { return elems.empty(); }
};

template <class T, template <class> class CONT >
void stack<T, CONT>::push( T const& elem )
{
    elems.push_back( elem );
}

template <class T, template <class> class CONT >
void stack<T, CONT>::pop( )
{
    elems.pop_back();
}

template <class T, template <class> class CONT >
T stack<T, CONT>::top( ) const 
{
    return elems.back(); 
}


int main() 
{
    stack<int> s;
    s.push(7);
    s.push(3);
    cout << "top = "  << s.top() << endl;
    s.pop();
    cout << "top = "  << s.top() << endl;

    stack<int, vector> h;
    h.push(5);
    h.push(9);
    cout << "top = "  << h.top() << endl;
    h.pop();
    cout << "top = "  << h.top() << endl;


    return 0;
}
