// File: stack.h
//
// Demo of a stack template
//
// CSCI 1300
// Karl Winklmann
// Spring 2004

#ifndef STACK
#define STACK

#include <cstdlib>
#include <cassert>

template <class Entry> 
class stackNode;

template <class Entry>
class stack
{
    public:
        stack ();
        ~stack ();

        Entry top () const;
        void push (Entry e);
        void pop ();

        bool empty () const;

    private:
        stackNode<Entry>* topNode;
};

template <class Entry>
class stackNode
{
    friend class stack<Entry>;

    public:
        stackNode (
            Entry e, 
            stackNode* b = NULL
        );
        ~stackNode ();

    private:
        Entry entry;
        stackNode* below;
};

#include "stack.template"

#endif
