/*
 *  Sequence adapters
 * 
 *  Stack
 * 
 */

template <class T, class C = deque<T> > class std::stack {
protected:
    C c;
public:
    typedef typename C::value_type value_type;
    typedef typename C::size_type size_type;
    typedef C container_type;

    explicit stack(const C& a = C()) : c(a) { }

    bool empty() const { return c.empty(); }
    size_type size() const { return c.size(); }

    value_type& top() { return c.back(); }
    const value_type& top() const { return c.back(); }

    void push(const value_type& x) { c.push_back(x); }
    void pop() { c.pop_back(); }
};


/*
 *  Usage of stack
 *
 */

stack<char> s1;                 // uses a deque<char> to store elements of type char
stack< int,vector<int> > s2;    // uses a vector<int> to store elements of type int