#include #include void Exception(int Condition, char *ErrorMsg){ if(Condition){cerr << ErrorMsg << endl; abort();} } template class AbsQueue{ public: AbsQueue(){} //默然构造函数 virtual ~AbsQueue(){} //析构函数 virtual bool IsEmpty() const = 0; //判队空 virtual bool IsFull() const = 0; //判队满 virtual void MakeEmpty() = 0; //将队清空 virtual void EnQueue( ElemType &x) = 0; //进队 virtual void DeQueue() = 0; //出队 virtual const ElemType &Front() = 0; //取队首元素 private: AbsQueue(const AbsQueue &){}; //冻结复制构造函数 }; static const int InitQueueSize = 10; template class Queue:public AbsQueue{ public: Queue(); //构造函数 ~Queue(){ delete []Array;} //析构函数 bool IsEmpty() const {return front == rear;} //判队空 bool IsFull() const {return (rear + 1) % MaxSize == front;} //判队满 void MakeEmpty() {front = rear = 0;} //将队清空 void EnQueue( ElemType &x); //进队 void DeQueue(); //出队 const ElemType &Front(); //取对首元素 const Queue &operator=(const Queue &R); private: ElemType *Array; //存放结点的数组名 int front, rear; //队顶指针 int MaxSize; //队的容量 void DoubleQueue(); //加倍数组的容量 void Increment(int &x); //循环数组指针后移一位 }; template Queue::Queue():MaxSize(InitQueueSize),front(0),rear(0){ //构造函数,空间大小为MaxSize Array = new ElemType[MaxSize]; } template const ElemType &Queue::Front(){ //读取队首结点 Exception(IsEmpty(), "Queue is empty!"); return Array[front]; } template void Queue::EnQueue( ElemType &x){ if(IsFull) DoubleQueue(); Array[rear] = x; Increment(rear); } template void Queue::Increment( int &x){//循环数组指针后移一位 if(++x == MaxSize) x = 0; } template void Queue::DeQueue(){ //将队首元素出队 Exception(IsEmpty(), "Queue is underflow!"); Increment(frent); } template const Queue &Queue::operator=(const Queue &R){ if(this == &R) return *this; delete []Array; Array = new EleemType[R.MaxSize]; //分配存储单元 MaxSize = R.MaxSize; for(int j=0,k=R.front; k void Queue::DoubleQueue(){ int NewSize = 2 * MaxSize; ElemType *oldarr = Array; Array = new ElemType[NewSize]; for(int j = 0, k = front; k != rear; j++, Increment(k)) Array[j] = oldarr[j]; //逐个复制结点 MaxSize = NewSize; delete []oldarr; } void main() { }