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<<",";
- }
- }
|