#ifndef STACK_H #define STACK_H #include "../Exception.h" template class Stack { public: Stack() { pos = 0; capacity = 4; data = new T[capacity]; } Stack(const Stack& orig) { pos = orig.pos; capacity = orig.capacity; data = new T[capacity]; memcpy(data, orig.data, capacity * sizeof(T)); } Stack& operator=(const Stack& orig) { delete[] data; pos = orig.pos; capacity = orig.capacity; data = new T[capacity]; memcpy(data, orig.data, capacity * sizeof(T)); return *this; } virtual ~Stack() { delete[] data; } int getSize() { return pos; } bool isEmpty() { return pos == 0; } void push(T t) { if(pos >= capacity) { int newCapacity = capacity * 2; T* t = new T[newCapacity]; memcpy(t, data, capacity * sizeof(T)); delete[] data; data = t; capacity = newCapacity; } data[pos] = t; pos++; } T pop() { if(pos == 0) { throw Exception("pop on empty stack"); } return data[--pos]; } T peek() { if(pos == 0) { throw Exception("peek on empty stack"); } return data[pos - 1]; } private: int capacity; int pos; T* data; }; #endif