// A Stack for ints
class Stack2
{
  public:
    Stack2(int capacity) : items_(new int[capacity]), count_(0) {}
    ~Stack2() { delete[] items_; }
    void Push(int item) { items_[count_++] = item; }
    int Pop() { return items_[--count_]; }
    bool IsEmpty() { return (count_ == 0); }
    
  private:
    int *items_;
    int count_;
};

// A Stack for doubles
class Stack2
{
  public:
    Stack2(int capacity) : items_(new double[capacity]), count_(0) {}
    ~Stack2() { delete[] items_; }
    void Push(double item) { items_[count_++] = item; }
    double Pop() { return items_[--count_]; }
    bool IsEmpty() { return (count_ == 0); }
    
  private:
    double *items_;
    int count_;
};

// A Stack for char *
class Stack2
{
  public:
    Stack2(int capacity) : items_(new char *[capacity]), count_(0) {}
    ~Stack2() { delete[] items_; }
    void Push(char * item) { items_[count_++] = item; }
    char * Pop() { return items_[--count_]; }
    bool IsEmpty() { return (count_ == 0); }
    
  private:
    char **items_;
    int count_;
};

// A Stack for StopWatches
class Stack2
{
  public:
    Stack2(int capacity) : items_(new StopWatch[capacity]), count_(0) {}
    ~Stack2() { delete[] items_; }
    void Push(StopWatch item) { items_[count_++] = item; }
    StopWatch Pop() { return items_[--count_]; }
    bool IsEmpty() { return (count_ == 0); }
    
  private:
    StopWatch *items_;
    int count_;
};