//EXAMPLE using Abstract Interface class Stack
#include <iostream.h>

class Stack {
  public:
    virtual void push (int) = 0;
    virtual int pop () = 0;
    virtual bool isFull () = 0;
    virtual bool isEmpty () = 0;
    virtual Stack* copy () = 0;
};

class FixedStack : public Stack {
  private:
    int *contents;
    int top;
    int max;
  public:
    FixedStack (int max) {
      this->contents = new int[max];
      this->top = 0;
      this->max = max;
    }
    virtual void push (int x) {
      contents[top++] = x;
    }
    virtual int pop () {
      return contents[--top];
    }
    virtual bool isFull () {
      return top == max;
    }
    virtual bool isEmpty () {
      return top == 0;
    }
    virtual Stack* copy () {
      FixedStack *result = new FixedStack (max);
      for (int i=0; i< top; i++){
           result->contents[i] = contents[i];
      }
      result->top = top;
      return result;
    }
};

main () {
  Stack *s = new FixedStack (5);
  s->push (1);
  s->push (2);
  s->push (3);
  cout << "Popping: " << s->pop();
  cout << ", " << s->pop ();
  cout << ", " << s->pop () << endl;
}