- 说明
- 基于顺序表实现的顺序双端队列
- 基于链表实现的链式双端队列
一、说明
思路大致与队列相同,增添了从头部入队、尾部出队等操作。
再次感叹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
同顺序表