C++实现有哨兵的双向循环链表:
#include<iostream> #include<stack> using namespace std; template<class T> class Node { private: T data; Node<T>* next; public: Node() { Node=NULL; } Node(T d) { data=d; next=NULL; } }; template<class T> class myqueue { private: Node<T> *tail; public: myqueue() { tail=new Node<T>(); //tail->next=NULL; tail->next=tail; //这种表示采用的是循环队列,且队列头是一个哨兵为空,它的下一个才是队列的第一个数据 } bool empty() { //return (NULL==tail->next) return (tail->next==tail); } void push(T d) { Node<T> *p=new Node<T>(d); //p->next=NULL; p->next=tail->next; tail->next=p; tail=p; //始终标记出尾部的位置 } T front() //取队列的第一个元素 { if(empty()) { cout<<"queue is empty!"<<endl; exit(0); } Node<T> *p=tail->next; //这是一个循环链表构成的队列,尾部的链接的下一个就是队列头 T data=p->next->data; //队列头链接的下一个才是第一个数据 return data; } void pop() //队列的第一个元素出队列 { Node<T> *p=tail->next; Node<T> *q=p->next; p->next=q->next; if(q==tail) tail=p; delete q; q=NULL; } }; |