1 template<typename ElemType> 2 class SqQueue 3 { 4 protected: 5 int count; 6 int front,rear; 7 int maxSize; 8 ElemType *elem; 9 public: 10 SqQueue(){} 11 SqQueue(int size); 12 virtual ~SqQueue(); 13 int Length() const; 14 bool Empty() const; 15 void Clear(); 16 void Traverse(void (*visit)(const ElemType &))const; 17 bool OutQueue(ElemType &e); 18 bool GetHead(ElemType &e) const; 19 bool InQueue(const ElemType &e); 20 SqQueue(const SqQueue<ElemType> ©); 21 SqQueue<ElemType> &operator =(const SqQueue<ElemType> ©); 22 }; 23 template<typename ElemType> 24 //构造函数 25 SqQueue<ElemType>::SqQueue(int size) 26 { 27 maxSize=size; 28 elem=new ElemType[maxSize]; 29 rear=front=0; 30 count=0; 31 } 32 template<typename ElemType> 33 //虚虚构函数 34 SqQueue<ElemType>::~SqQueue() 35 { 36 delete []elem; 37 } 38 template<typename ElemType> 39 //SqQueue长度 40 int SqQueue<ElemType>::Length() const 41 { 42 return count; 43 } 44 template<typename ElemType> 45 //判断空队列 46 bool SqQueue<ElemType>::Empty() const 47 { 48 return count==0; 49 } 50 template<typename ElemType> 51 //清空队列 52 void SqQueue<ElemType>:: Clear() 53 { 54 rear=front=0; 55 count=0; 56 } 57 template<typename ElemType> 58 //遍历队列 59 void SqQueue<ElemType>::Traverse(void(*visit)(const ElemType & ))const 60 { 61 for(int pos=front;pos!=rear;pos=(pos+1)%maxSize) 62 (*visit)(elem[pos]); 63 64 } 65 template<typename ElemType> 66 //队首出 67 bool SqQueue<ElemType>::OutQueue(ElemType &e) 68 { 69 if(!Empty()) 70 { 71 e=elem[front]; 72 front=(front+1)%maxSize; 73 count--; 74 return true; 75 } 76 else return false; 77 } 78 template<typename ElemType> 79 //加入新队尾 80 bool SqQueue<ElemType>::InQueue(const ElemType &e) 81 { 82 if(count==maxSize) 83 return false; 84 else 85 { 86 elem[rear]=e; 87 rear=(rear+1)%maxSize; 88 count++; 89 return true; 90 } 91 92 } 93 template<typename ElemType> 94 //复制构造 95 SqQueue<ElemType>::SqQueue(const SqQueue<ElemType> ©) 96 { 97 maxSize=copy.maxSize; 98 elem=new ElemType[maxSize]; 99 front=copy.front; 100 rear=copy.rear; 101 count=copy.count; 102 for(int pos=front;pos!=rear;pos=(pos+1)%maxSize) 103 elem[pos]=copy.elem[pos]; 104 } 105 template<typename ElemType> 106 //重载=operator 107 SqQueue<ElemType> &SqQueue<ElemType>::operator=(const SqQueue<ElemType> ©) 108 { 109 if(©!=this) 110 { 111 maxSize=copy.maxSize; 112 delete []elem; 113 elem=new SqQueue<ElemType>[maxSize]; 114 count=copy.count; 115 front=copy.front; 116 rear=copy.rear; 117 for(int pos=front;pos!=rear;pos=(pos+1)%maxSize) 118 elem[pos]=copy.elem[pos]; 119 return *this; 120 } 121 122 }