1. 程式人生 > >基於連結串列的雙端佇列的類模板的C++實現

基於連結串列的雙端佇列的類模板的C++實現

/*
用連結串列實現雙端佇列(儲存整型)
該佇列有以下幾個功能
											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;
}