#include #include void Exception(int Condition, char *ErrorMsg){ if(Condition){cerr << ErrorMsg << endl; abort();} } template class AbsStack{ public: AbsStack(){} //默然构造函数 virtual ~AbsStack(){} //析构函数 virtual bool IsEmpty() const = 0; //判栈空 virtual bool IsFull() const = 0; //判栈满 virtual void MakeEmpty() = 0; //将栈清空 virtual void Push( ElemType &x) = 0; //进栈 virtual void Pop() = 0; //出栈 virtual const ElemType &Top() = 0; //取顶点元素 private: AbsStack(const AbsStack &){}; //冻结复制构造函数 }; template class Stack; //前向说明 template class ListNode{ friend class Stack; //便于访问结点的私有成员 private: ListNode *Next; //指向下一个结点 ElemType Element; //结点数据 public: ListNode(const ElemType &E, ListNode *N = 0):Element(E), Next(N) {}; //构造函数 ListNode():Next(0){}; //构造函数 ~ListNode(){}; //析构函数 }; template class Stack:public AbsStack{ public: Stack():top(0){}; //构造函数 ~Stack(){ MakeEmpty();} //析构函数 bool IsEmpty() const {return top == 0;} //判栈空 bool IsFull() const {return false;} //判栈满 void MakeEmpty(); //将栈清空 void Push( ElemType &x); //进栈 void Pop(); //出栈 const ElemType &Top(); //取顶点元素 const Stack &operator=(const Stack &R); private: ListNode *top; //栈顶指针 }; template const ElemType &Stack::Top(){ //读取栈顶结点 Exception(IsEmpty(), "There is not a node!"); return top->Element; } template void Stack::Push( ElemType &x){ top = new ListNode(x, top); } template void Stack::Pop(){ //将栈顶元素出栈 Exception(IsEmpty(), "Stack is underflow!"); ListNode *q = top; top = top->Next; delete q; } template const Stack &Stack::operator=(const Stack &R){ if(this == &R) return *this; MakeEmpty(); if(R.IsEmpty()) return *this; ListNode *p = new ListNode(R.top->Element); ListNode *Rp = R.top->Next; top = p; while(Rp != 0){ p->Next = new ListNode(Rp->Element); p = p->Next; Rp = Rp->Next; } return *this; } template void Stack::MakeEmpty(){ while(!IsEmpty()) Pop(); } void main() { }