简单的单向链表实现的普通队列,还有双向链表实现的双端队列
#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双端队列
#include<iostream> #include<cstdio> using namespace std; template<typename T> struct pt{ pt* prev; T v; pt* next; pt():prev(0),v(0),next(0){} }; template<typename T> class delist{ typedef pt<T>* ptr; ptr head,tail; public: 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->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(){ ptr tmp=head->next; delete head; head=tmp; if(!head)tail=head=0; } void pop2(){ ptr tmp=tail->prev; delete tail; tail=tmp; if(!tail)head=tail=0; } T& front1(){ if(head)return head->v; } T& front2(){ if(tail)return tail->v; } bool empty(){ return head==0||tail==0; } }; int main(){ delist<int>q; for(int i=1;i<=10;++i){ q.push1(i); } return 0; }