enqueue.h //用"链表"实现队列 //入队和出队的时间复杂度为O(1) //复制、清空和遍历队列的时间复杂度为O(n) template <class DT> struct Node{ DT info; Node<DT> *next; }; template <class DT> class Queue { public: Queue(); Queue(const Queue<DT> &apqueue); ~Queue(); Queue<DT>& operator=(const Queue<DT> &apqueue); void enqueue(const DT &element); bool dequeue(DT &deqEle); bool peek(DT &frontEle); //得到对头的数据 bool isEmpty() const; void makeEmpty(); private: Node<DT> *front; //指向header Node<DT> *back; //指向对尾结点 Node<DT> header; //设置一个空的头结点 inline void deepCopy(const Queue<DT> &apqueue); //"深复制" }; enqueue.cpp #include "enqueue.h" template<class DT> Queue<DT>::Queue() { front = back = &header; } template<class DT> Queue<DT>::Queue(const Queue<DT> &apqueue) { deepCopy(apqueue); } template<class DT> Queue<DT>::~Queue() { makeEmpty(); } template<class DT> void Queue<DT>::enqueue(const DT &element) { Node<DT> *ptr = new Node<DT>; ptr->info = element; back->next = ptr; back = ptr; } template<class DT> bool Queue<DT>::dequeue(DT &deqEle) { if(back == &header) return false; Node<DT> *ptr; ptr = front->next; deqEle = ptr->info; front->next = ptr->next; if(back == ptr) back = front; delete ptr; return true; } template<class DT> bool Queue<DT>::peek(DT &frontEle) { if(back == &header) return false; frontEle = front->next->info; return true; } template<class DT> bool Queue<DT>::isEmpty() const { return front == back; } template<class DT> void Queue<DT>::makeEmpty() { DT temp; while( dequeue(temp) ); } template<class DT> void Queue<DT>::deepCopy(const Queue<DT> &apqueue) { Node<DT> *oriPtr = apqueue.front; // Node<DT> *ptr = new Node<DT>; // front = ptr = oriPtr; //这样赋值就把apqueue和this绑在一起拉... Node<DT> *ptr = front = &header; while(oriPtr != apqueue.back) //循环体中操作oriPtr->next的内容,这样就可以把apqueue.back拷贝进去! { ptr->next = new Node<DT>; ptr = ptr->next; oriPtr = oriPtr->next; ptr->info = oriPtr->info; } back = ptr; } 测试用例: #include<iostream> #include<string> #include "enqueue.cpp" using namespace std; void main() { string str[9] = {"the","quick","fox","jumps","over","the","slow","red","turtle"}; Queue<string> obj; string s; for(size_t ix=0;ix<9;++ix) { obj.enqueue(str[ix]); } Queue<string> obj1(obj); //测试复制构造函数 obj1.peek(s); cout<<s<<endl; for(size_t ix=0;ix<9;++ix) //利用dequeue进行毁灭式遍历队列 { obj1.dequeue(s); cout<<s<<","; } if(obj1.isEmpty()) cout<<endl<<"obj1 is empty!"<<endl; Queue<string> obj2 = obj; //测试重载“=”操作符 obj2.peek(s); cout<<s<<endl; for(size_t ix=0;ix<9;++ix) { obj.dequeue(s); cout<<s<<","; } }