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

      

  • 相关阅读:
    UiPath鼠标操作文本的介绍和使用
    UiPath鼠标操作元素的介绍和使用
    UiPath循环活动Do While的介绍和使用
    UiPath循环活动Do While的介绍和使用
    UiPath循环活动While的介绍和使用
    设计模式之: Decorator(装饰器)模式
    C语言深度解剖读书笔记(1.关键字的秘密)
    HDU 4341 Gold miner (分组背包)
    HDU 3496 Watch The Movie( 二维费用背包)
    Mahout源码MeanShiftCanopyDriver分析之一初识
  • 原文地址:https://www.cnblogs.com/eric-walker/p/9436914.html
Copyright © 2011-2022 走看看