Please implement Stack using Array (capacity 100) - Use template to be able to handle any types of data - In main function, create two stacks (an integer type stack and character type stack). Test your stacks with functions including push (), pop(), top(), isEmpty(), and size() - Make a header file and a source file separately - code should have no compile error template class ArrayStack { private: // member data enum { CAPACITY = 1000 }; // default capacity of stack int capacity; // actual length of stack array Object* S; // the stack array int t; // index of the top of the stack public: //constructor given max capacity ArrayStack(int cap = CAPACITY) { capacity = cap; S = new Object[capacity]; t = -1; } int size() const // number of elements in the stack { return(t + 1); } bool isEmpty() const // is the stack empty? { return(t < 0); } // return the top of the stack Object& top() throw(StackEmptyException) { if (isEmpty()) throw StackEmptyException(\"Access to empty stack\"); return S[t]; } // push object onto the stack void push(const Object& elem) throw(StackFullException) { if (size() == capacity) throw StackFullException(\"Stack overflow\"); S[++t] = elem; } // pop the stack Object pop() throw(StackEmptyException) { if (isEmpty()) throw StackEmptyException(\"Access to empty stack\"); return S[t--]; } ArrayStack(const ArrayStack& st); //copy constructor // assignment operator constructor ArrayStack& operator=(const ArrayStack& st); ~ArrayStack() // destructor {delete[] S; } }; template // copy constructor ArrayStack:: ArrayStack(const ArrayStack& st) { capacity = st.capacity; t = st.t; S = new Object[capacity]; for (int i = 0; i <= t; i++){ // copy contents S[i] = st.S[i]; } } template // assignment operator ArrayStack& ArrayStack:: operator=(const ArrayStack& st) { if (this != &st) { //avoid self copy (x=x) delete[] S; // delete old contents capacity = st.capacity; t = st.t; S = new Object[capacity]; for (int i = 0; i <= t; i++) { // copy contents S[i] = st.S[i]; } } return *this; } Solution template class ArrayStack { private: // member data enum { CAPACITY = 1000 }; // default capacity of stack int capacity; // actual length of stack array Object* S; // the stack array int t; // index of the top of the stack public: //constructor given max capacity ArrayStack(int cap = CAPACITY) { capacity = cap; S = new Object[capacity]; t = -1; } int size() const // number of elements in the stack { return(t + 1); } bool isEmpty() const // is the stack empty? { return(t < 0); } // return the top of the stack Object& top() throw(StackEmptyException) { if (isEmpty()) throw StackEmptyException(\"Access to empty stack\"); return S[t]; } // push object onto the stack void push(const Object& elem) throw (StackFullException) { if (size() == capacity) throw StackFullException(\"Stack overflow\"); S[++t] = elem; } // pop the stack Object pop() throw (StackEmptyException) { if (isEmpty()) throw StackEmptyException(\"Access to empty stack\"); return S[t--]; } } .