#ifndef STACK_H #define STACK_H template class Stack { public: Stack(); Stack(const Stack &); ~Stack(); bool empty() const; T peek() const; void push(T value); T pop(); int getSize() const; private: T *elements; int size; int capacity; void ensureCapacity(); }; template Stack::Stack() : size(0), capacity(16) { elements = new T[capacity]; } template Stack::Stack(const Stack &stack) { elements = new T[stack.capacity]; size = stack.size; capacity = stack.capacity; for (int i = 0; i < size; i++) { elements[i] = stack.elements[i]; } } template Stack::~Stack() { delete[] elements; } template bool Stack::empty() const { return (size == 0); } template T Stack::peek() const { return elements[size - 1]; } template void Stack::push(T value) { ensureCapacity(); elements[size++] = value; } template void Stack::ensureCapacity() { if (size >= capacity) { T *old = elements; capacity = 2 * size; elements = new T[size * 2]; for (int i = 0; i < size; i++) elements[i] = old[i]; delete[] old; } } template T Stack::pop() { return elements[--size]; } template int Stack::getSize() const { return size; } #endif