双端队列的物理实现(顺序双端队列+链式双端队列)

  • 说明
  • 基于顺序表实现的顺序双端队列
  • 基于链表实现的链式双端队列

一、说明

思路大致与队列相同,增添了从头部入队、尾部出队等操作。

再次感叹delete的耗时

二、基于顺序表实现的顺序双端队列

1、Deque.h

#include<iostream>
using namespace std;
#ifndef _Deque
#define _Deque
namespace wangzhe
{
	template<typename E>
	class Deque
	{
		private:
		        void operator = (const Deque&) {}
		        Deque(const Deque&) {}
		public:
			Deque() {}
			virtual ~Deque() {}
			virtual void clear() =0;
			virtual void Push_back(const E&) =0;
			virtual void Push_front(const E&) =0;
			virtual E Pop_back() =0;
			virtual E Pop_front() =0;
			virtual const E& frontValue() const =0;
			virtual const E& backValue() const =0;
			virtual int length() const =0;
	};
}
#endif

2、ADeque.h

#include<iostream>
using namespace std;
#include"Deque.h"
#ifndef _ADeque
#define _ADeque
namespace wangzhe
{
	template<typename E>
	class ADeque:public Deque<E>
	{
		private:
			int maxSize;//最大容量
		        int front;//头 
		        int rear;//尾 
		        E *listArray;//表 
		public:
			ADeque(int size) ;//构造函数 
			~ADeque() ;//析构函数 
			void clear() ;//清空元素 
			void Push_back(const E& it) ;//从尾部入队 
			void Push_front(const E& it) ;//从头部入队 
			E Pop_back() ;//从尾部出队 
			E Pop_front() ;//从头部出队 
			const E& frontValue() const ;//返回头部元素值 
			const E& backValue() const ;//返回尾部元素值 
			int length() const ;//元素个数 
	};
}
#endif

3、ADeque.cpp

#include<iostream>
using namespace std;
#include"ADeque.h"
namespace wangzhe
{
	template<typename E>
	ADeque<E>::ADeque(int size)
	{
		maxSize=size+1;
		front=1;
		rear=0;
		listArray=new E[maxSize];
	}
	
	template<typename E>
	ADeque<E>::~ADeque()
	{
		delete [] listArray;
	}
	
	template<typename E>
	void ADeque<E>::clear()
	{
		rear=0;
		front=1;
	}
	
	template<typename E>
	void ADeque<E>::Push_back(const E& it)
	{
		if((rear+2)%maxSize==front)
		{
			cout<<"Deque is full"<<endl;
			return;
		}
		rear=(rear+1)%maxSize;
		listArray[rear]=it;
	}
	
	template<typename E>
	void ADeque<E>::Push_front(const E& it)
	{
		if((rear+2)%maxSize==front)
		{
			cout<<"Deque is full"<<endl;
			return;
		}
		front=(front-1)%maxSize;
		listArray[front]=it;
	}
	
	template<typename E>
	E ADeque<E>::Pop_back()
	{
		if(length()==0)
		{
			cout<<"Deque is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨 
		}
		E it=listArray[rear];
		rear=(rear-1)%maxSize;
		return it;
	}
	
	template<typename E>
	E ADeque<E>::Pop_front()
	{
		if(length()==0)
		{
			cout<<"Deque is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨 
		}
		E it=listArray[front];
		front=(front+1)%maxSize;
		return it;
	}
	
	template<typename E>
	const E& ADeque<E>::frontValue() const
	{
		if(length()==0)
		{
			cout<<"Queue is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨 
		}
		return listArray[front];
	}
	
	template<typename E>
	const E& ADeque<E>::backValue() const
	{
		if(length()==0)
		{
			cout<<"Queue is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨 
		}
		return listArray[rear];
	}
	
	template<typename E>
	int ADeque<E>::length() const
	{
		return ((rear+maxSize)-front+1)%maxSize;
	}
}

4、main.cpp

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#include"ADeque.h"
#include"ADeque.cpp"
using namespace wangzhe;
int main(int argc, char** argv) 
{
	ADeque<int> a(5);
	a.Push_back(9);
	cout<<a.frontValue()<<endl ;
	a.Push_front(8); 
	cout<<a.frontValue()<<endl ;
	a.Push_back(2);
	cout<<a.backValue()<<endl ;
	a.Push_back(3);
	a.Push_back(4);
	a.Push_back(5);
	a.Push_back(6);
	cout<<a.length() <<endl;
	return 0;
}

 

三、基于链表实现的链式双端队列

1、Link.h

#include <iostream>
using namespace std;
#ifndef _Link
#define _Link
namespace wangzhe
{
	template<typename E> 
	class Link
	{
	    public:
		    E element;
			Link *next;
			Link(const E& elemval,Link* nextval =NULL)
			{
			    element=elemval;
				next=nextval;	
			}	
			Link(Link* nextval=NULL)
			{
				next=nextval;
			}
	};
}
#endif

2、Deque.h

同顺序表

3、LDeque.h

#include<iostream>
using namespace std;
#include"Link.h"
#include"Deque.h"
#ifndef _LDeque
#define _LDeque
namespace wangzhe
{
	template<typename E>
	class LDeque:public Deque<E>
	{
		private:
			Link<E>* front;
			Link<E>* rear;
			int size;
		public:
			LDeque() ;//构造函数 
			~LDeque() ;//析构函数 
			void clear() ;//清空元素 
			void Push_back(const E& it) ;//从尾部入队 
			void Push_front(const E& it) ;//从头部入队 
			E Pop_back() ;//从尾部出队 
			E Pop_front() ;//从头部出队 
			const E& frontValue() const ;//返回头部元素值 
			const E& backValue() const ;//返回尾部元素值 
			int length() const ;//元素个数 
	};
}
#endif

4、LDeque.cpp

#include<iostream>
using namespace std;
#include"LDeque.h"
namespace wangzhe
{
	template<typename E>
	LDeque<E>::LDeque()
	{
		front=rear=new Link<E>();
		size=0;
	}
	
	template<typename E>
	LDeque<E>::~LDeque()
	{
		clear();
		delete front;
	}
	
	template<typename E>
	void LDeque<E>::clear()
	{
		/*while(front->next!=NULL)
		{
			rear=front->next;
			delete rear;
		}
		rear=front;*/
		rear=front;
		front->next=NULL;
		size=0;
	}
	
	template<typename E>
	void LDeque<E>::Push_back(const E& it)
	{
		rear=rear->next=new Link<E>(it,NULL);
		size++;
	}
	
	template<typename E>
	void LDeque<E>::Push_front(const E& it)
	{
		front->next=new Link<E>(it,front->next);
		size++;
	}
	
	template<typename E>
	E LDeque<E>::Pop_front()
	{
		if(size==0)
		{
			cout<<"Queue is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨 
		}
		Link<E>* temp=front->next;
		E it=temp->element;
		front->next=temp->next;
		if(rear==temp) rear=front;
		//delete temp;
		size--;
		return it;
	}
	
	template<typename E>
	E LDeque<E>::Pop_back()
	{
		if(size==0)
		{
			cout<<"Queue is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨 
		}
		E it=rear->element;
		Link<E>* temp=front->next;
		while(temp->next!=rear) 
		{
			temp=temp->next;
		}
		//delete rear;
		rear=temp;
		size--;
		return it;
	}
	
	template<typename E>
	const E& LDeque<E>::frontValue() const
	{
		if(size==0)
		{
			cout<<"Queue is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨
		}
		return front->next->element;
	}
	
	template<typename E>
	const E& LDeque<E>::backValue() const
	{
		if(size==0)
		{
			cout<<"Queue is empty"<<endl;
			return -1;//以-1作为出错的返回值,不严谨
		}
		return rear->element;
	}
	
	template<typename E>
	int LDeque<E>::length() const
	{
		return size;
	}
}

5、main.cpp

同顺序表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值