/************************************************************************/ /* 队列节点类 */ /************************************************************************/ template <class T> class LinkedNode { public: LinkedNode<T> *next;//指向下一个节点的指针 T data;//数据域 LinkedNode(const T& data, LinkedNode<T> *next); LinkedNode(const T& data); LinkedNode(); //使用默认的析构函数 };
/************************************************************************/ /*前提条件:类T必须有无参数的构造函数 */ /************************************************************************/ template <class T> LinkedNode<T>::LinkedNode():next(0) { }
template <class T> LinkedNode<T>::LinkedNode(const T& data):next(0), data(data) { }
template <class T> LinkedNode<T>::LinkedNode(const T& data, LinkedNode<T> *next):data(data), next(next) { }
/************************************************************************/ /* 对列类 */ /************************************************************************/ template <class T> class Queue{ public: LinkedNode<T> *head; LinkedNode<T> *tail; Queue(); ~Queue(); bool EnQueue(const T& data); bool DeQueue(T& data); int GetLength() const; bool IsEmpty() const; };
template <class T> Queue<T>::Queue() { head = new LinkedNode<T>(); tail = head; }
template <class T> Queue<T>::~Queue() { LinkedNode<T>* first = 0; while(head) { first = head; head = head->next; delete first; } }
/************************************************************************/ /*入队 */ /************************************************************************/ template <class T> bool Queue<T>::EnQueue(const T& data) { LinkedNode<T> *element = new LinkedNode<T>(data); if(!element) return false; this->tail->next = element; this->tail = element; return true; }
/************************************************************************/ /* 出对 */ /************************************************************************/ template <class T> bool Queue<T>::DeQueue(T& data) { if(!head->next) { return false; }
//对列只有一个元素 if(head->next == tail) { tail = head; } data = head->next->data; LinkedNode<T>* temp; temp = head->next; head->next = head->next->next; delete temp; return true; }
/************************************************************************/ /* 获取对列长度 */ /************************************************************************/ template <class T> Queue<T>::GetLength() const { int size = 0; LinkedNode<T>* first = head->next; while(first) { size++; first = first->next; }
return size; }
/************************************************************************/ /* 判断队列是否为空 */ /************************************************************************/ template <class T> bool Queue<T>::IsEmpty() const { return (head == tail) ? true : false; } |