简单的单向链表实现的普通队列,还有双向链表实现的双端队列
#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;
}
};