#include <iostream>

#ifndef PSTACK
#define PSTACK

#define NULLVAL 0

using namespace std;

#include "PStackExceptions.h"

typedef int Element;
const Element INIT = 0;
 
class PStack
{
  private:
    
    class Node
    {
      public:

        Element data;
        Node  * next;

        Node() : data(INIT), next(NULLVAL)
        {
        }

        Node(Element element) : data(element), next(NULLVAL)
        {

        }

        Node(Element element, Node * link) : data(element), next(link)
        {

        }
    };

    typedef Node * Link;

  public:

    PStack();
    PStack(const PStack & original);
    ~PStack();
    PStack  & operator=(const PStack & original);
    bool isEmpty() const;
    int getSize() const;
    Element getTop() const;
    void push(Element element);
    void pop();
    void display(ostream & out) const;
    void read(istream & in);

  private:
    Link top;
    int size;
};

    ostream & operator<<(ostream & out, const PStack & stack);

    istream & operator>>(istream & in, PStack & stack);

#endif





     
