简单的单向链表实现的普通队列,还有双向链表实现的双端队列
#include<iostream> #include<cstdio> using namespace std; template<typename T> struct pt{ T v; pt* next; pt():v(0),next(0){} }; template<typename T> class list{//其实就是queue typedef pt<T>* ptr; ptr head,tail; public: list(){ head=tail=0; } void push(T &x){ if(!head){ head=tail=new pt<T>; tail->v=x; }else{ tail->next=new pt<T>; tail=tail->next; tail->v=x; } } T& front(){ if(head)return head->v; } void pop(){ ptr tmp=head->next; delete head; head=tmp; } bool empty(){ return head==0; } }; int main(){ list<int> q; for(int i=1;i<=100;++i){ q.push(i); } while(!q.empty()){ cout<<q.front()<<endl; q.pop(); } return 0; }
第一个是用我手写的list实现的队列
第二个是STL队列
慢了整整一秒啊(都是cin和cout,没有读优)
下面是delist双端队列
pop时千万要记得清空前驱和后继指针(因为这个调了一晚上)
template<typename T> struct pt{ pt* prev; T v; pt* next; pt():prev(0),v(0),next(0){} }; template<typename T> class delist{ public: typedef pt<T>* ptr; ptr head,tail; delist(){head=tail=0;} void push1(T& x){ if(head){ head->prev=new pt<T>; head->prev->next=head; head=head->prev; head->v=x; }else{ head=tail=new pt<T>; head->next=head->prev=0; head->v=x; } } void push2(T& x){ if(tail){ tail->next=new pt<T>; tail->next->prev=tail; tail=tail->next; tail->v=x; }else{ head=tail=new pt<T>; tail->v=x; } } void pop1(){ if(empty())return; ptr tmp=head->next; delete head; head=tmp; if(!head){tail=head=0;return ;} head->prev=0; } void pop2(){ if(empty())return; ptr tmp=tail->prev; delete tail; tail=tmp; if(!tail){head=tail=0;return;} tail->next=0; } T& front1(){ return head->v; } T& front2(){ return tail->v; } bool empty(){ return head==0||tail==0; } };