基于链表的双端队列的类模板的C++实现

时间:2022-06-29 14:53:49
/*
用链表实现双端队列(储存整型)
该队列有以下几个功能
											1.Createdeque输入n个元素来初始化队列
											2.cleardeque清空整个队列
											3.f_inde(T e)在队首插入元素e
											4.f_outde()队首元素出队
											5.l_inde(T e)在队尾插入元素e
											6.l_outde队尾元素出队
											7.empty检测队列是否为空
											8.length输出并返回队列长度
											9.display打印从队首到队尾的每一元素
该队列有以下成员:
											1.fp队首指针
											2.lp队尾指针
											3.len队列长度
by chczy
2017/10/16 21:34
*/
#include<iostream>
#include<algorithm>
#include<new>
using namespace std;
template<class T>
struct node {
	node* nx;
	node* pr;
	T data;
};

template<class T>
class linkdeque {
public:
	linkdeque();//构造空队列
	~linkdeque() { cout << "destroy the deque!" << endl; };
	node<T>* Createdeque(int n);//构造长度为n的队列
	void cleardeque();//清空队列
	node<T>* f_inde(T e);//在队首插入元素e
	node<T>* f_outde();//队首元素出队
	node<T>* l_inde(T e);//在队尾插入元素e
	node<T>* l_outde();//队尾元素出队
	bool empty();//检测队列是否为空
	int length();//返回队列长度
	void display();//遍历并打印队列元素

private:
	node<T>* fp;//front pointer
	node<T>* lp;//rare pointer
	int len;
};

template<class T>
linkdeque<T>::linkdeque()
{
	fp = NULL;
	lp = NULL;
	len = 0;
}

template<class T>
node<T>* linkdeque<T>::Createdeque(int n)
{
	len = n;
	node<T> *L = new node<T>;
	L->nx = NULL;
	L->pr = NULL;
	node<T> *h = new node<T>;
	cin >> h->data;
	L->nx = h;
	h->pr = L;
	h->nx = NULL;
	fp = h;
	int i = n-1;
	n -= 1;
	node<T> *prev;
	prev = h;
	while (n--)
	{
		node<T> *p = new node<T>;
		cin >> p->data;
		prev->nx = p;
		p->pr = prev;
		p->nx = NULL;
		prev = p;
		if (n == 0)
			lp = p;
	}
	return fp;
}

template<class T>
void linkdeque<T>::cleardeque()
{
	while (!empty()) l_outde();
}

template<class T>
node<T>* linkdeque<T>::f_inde(T e)
{
	node<T>* p=new node<T>;
	p->data = e;
	p->nx = fp;
	fp->pr = p;
	p->pr = NULL;
	fp = p;
	++len;
	return fp;
}

template<class T>
node<T>* linkdeque<T>::f_outde()
{
	node<T> *p = fp;
	node<T> *s = p->nx;
	s->pr = NULL;
	fp = s;
	delete p;
	--len;
	return fp;
}

template<class T>
node<T>* linkdeque<T>::l_inde(T e)
{
	node<T>* p = new node<T>;
	p->data = e;
	p->pr = lp;
	lp->nx = p;
	p->nx = NULL;
	lp = p;
	++len;
	return lp;
}

template<class T>
node<T>* linkdeque<T>::l_outde()
{
	node<T> *p=lp;
	node<T> *s = p->pr;
	s->nx = NULL;
	lp = s;
	delete p;
	--len;
	return p;
}

template<class T>
bool linkdeque<T>::empty()
{
	if (len == 0)
		return 1;
	else
		return 0;
}

template<class T>
int linkdeque<T>::length()//打印并返回队列的长度
{
	cout << "队列的长度是:" << endl;
	cout << len << endl;
	return len;
}

template<class T>
void linkdeque<T>::display()
{
	if (len == 0)
	{
		cout << "no elem!" << endl;
		return;
	}
	int i = 0;
	node<T> *p = fp;
	cout << "队列长为" << len << endl;
	cout << "队列中的元素为: ";
	while (i != len)
	{
		cout << p->data << " ";
		p = p->nx;
		++i;
	}
	cout << endl;
}