zoukankan      html  css  js  c++  java
  • 链表实现队列(指针)

    简单的单向链表实现的普通队列,还有双向链表实现的双端队列

    #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;
    	}
    };
    

      

  • 相关阅读:
    ZOJ 3891 K-hash
    ZOJ 3890 Wumpus
    ZOJ 3888 Twelves Monkeys
    ZOJ 3885 The Exchange of Items
    HDU 3849 By Recognizing These Guys, We Find Social Networks Useful
    HDU 2242 考研路茫茫——空调教室
    BZOJ 3676: [Apio2014]回文串
    [转载]CAsyncSocket及CSocket注解
    WritePrivateProfileString()
    GetSystemMetrics()
  • 原文地址:https://www.cnblogs.com/eric-walker/p/9436914.html
Copyright © 2011-2022 走看看