#include<iostream>#include<exception>usingnamespace std;classOutOfRange:publicexception{public:constchar*what()constthrow(){return"ERROE! OUT OF Range.\n";}};classBadSize:publicexception{public:constchar*what()constthrow(){return"ERROR! BAD SIZE.\n";}};template<classT>classStack{public:virtualboolisEmpty()const=0;virtualboolisFull()const=0;virtualvoidclear()=0;virtualintsize()const=0;virtualvoidpush(const T& x)=0;virtual T pop()=0;virtual T getTop()const=0;virtual~Stack()=0;};template<classT>classseqStack:publicStack<T>{private:
T* data;int maxSize;int top;voidresize();public:seqStack(int initSize =100);~seqStack(){delete[] data;}boolisEmpty()const{return top ==-1;}boolisFull()const{return top +1== maxSize;}voidclear(){ top =-1;}intsize(){return top +1;}voidpush(const T& x);
T pop();
T getTop()const;};template<classT>seqStack<T>::seqStack(int initSize){if(initSize <=0)throwBadSize();
data =new T[initSize];
maxSize = initSize;
top =-1;}template<classT>voidseqStack<T>::push(const T& x){if(isFull())resize();
data[++pop]= x;}template<classT>
T seqStack<T>::pop(){if(isEmpty())throwOutOfRange();return data[top--];}template<classT>
T seqStack<T>::getTop()const{if(isEmpty())throwOutOfRange();return data[top];}template<classT>voidseqStack<T>::resize(){
T* p = data;
data =new T[maxSize *2];for(int i =0; i < maxSize;++i){
data[i]= p[i];}
maxSize *=2;delete[] p;}template<classT>classlinkStack:publicStack<T>{private:structLinkNode{
T val;
LinkNode* next;LinkNode(LinkNode* p =nullptr, const T& x):val(x),next(p){}}
LinkNode* top;public:linkStack():top(nullptr){}~linkStack(){clear();}voidclear();intsize()const;boolisEmpty()const{return top ==nullptr;}voidpush(const T& x);
T pop();
T getTop()const;};template<classT>voidlinkStack<T>::clear(){
LinkNode* del =nullptr;while(top){
del = top;
top = top->next;delete del;}}template<classT>intlinkStack<T>::size()const{
LinkNode* p = top;int cnt =0;while(p){
p = p->next;++cnt;}return cnt;}template<classT>voidlinkStack<T>::push(const T& x){
linkNode* p =newLinkNode(top, x);
top = p;}template<classT>
T linkStack<T>::pop(){if(isEmpty())throwOutOfRange();
T value = top->val;
LinkNode* del = top;
top = top->next;delete del;return value;}template<classT>
T linkStack<T>::getTop()const{if(isEmpty())throwOutOfRange();return top->val;}