您的位置:首页 > 理论基础 > 数据结构算法

数据结构c++实现----双端队列

2013-10-26 17:23 351 查看
双端队列,首尾都能进行入队和出队,所以我为了方便没有设置头结点,也不知道不设头节点是对是错!! 

代码如下:

头文件head.h

/***************************************
*这个node节点可以反复使用
*本来,我想用继承,但无法实现。又在类里定义node,但操作麻烦,前后指针操作都要使用函数
*最后确定用 友员
*修改时间: 2013 09 25 23:50
****************************************/

#ifndef HEAD

#define HEAD
#include<iostream>
using namespace std;
//template<typename T> class DoubleList;

template<typename T> class Deque;

template <typename T>
class LinkNode
{
public:
friend class Deque<T>;
LinkNode();
LinkNode( const T &elem);
//~LinkNode();用不到
private:
T data;
LinkNode *pPre;
LinkNode *pNext;
};

template <typename T>
LinkNode<T>::LinkNode():pPre(NULL),pNext(NULL)
{
//用于初始化头结点,data用不到。
}
template <typename T>
LinkNode<T>::LinkNode( const T &elem):data(elem),pPre(NULL),pNext(NULL)
{
//初始化其余元素
}

#endif


//deque.cpp

/****************************************************
* 双端队列
* 为了方便存取没有设置头结点
* 因为没有头结点,所以要特别注意判断为空,插入第一个元素,删除最后一个元素时,容易发生访问超界现象
*
*
* 完成日期:2013-10-26 17:17
*****************************************************/

#include"head.h"

template<typename T>
class Deque{
public:

Deque();
~Deque();

bool isEmpty();
void clear();

//log = 1 表示从队首插入
//log = 2 表示从队尾插入
void EnDeque( T elem ,int log );

//log = 1 表示从队首出队
//log = 2 表示从队尾出队
T    DeDeque( int log );

private:

LinkNode<T> *front;
LinkNode<T> *rear;
};

template<typename T>
Deque<T>::Deque(){
front = NULL;
rear = front;
}

template<typename T>
Deque<T>::~Deque(){
if( !isEmpty() ){
clear();
}
}

template<typename T>
bool Deque<T>::isEmpty(){
if( rear == NULL || front == NULL ){
return true;
}else{
return false;
}
}

template<typename T>
void Deque<T>::clear(){
LinkNode<T> *p;
if( front != NULL ){
p = front;
front = front->pNext;
delete p;
}
}

template<typename T>
void Deque<T>::EnDeque( T elem ,int log){
LinkNode<T> *p;
p = new LinkNode<T>;
p->data = elem;
if( front == NULL ){  //防止内存读写超界
front = p;
rear = p;
}else{
if( log == 1 ){
//if( front != NULL ){
front->pPre = p;
p->pNext = front;
front = p;
//}

}else{
rear->pNext = p;
p->pPre = rear;
rear = p;
}
}
}

template<typename T>
T Deque<T>::DeDeque(int log){
LinkNode<T> *p;
T q;
if( log == 1 ){
p = front;
front = front->pNext;
if(front != NULL){   //防止内存访问超界
front->pPre = NULL;
}
q = p->data;

delete p;

return q;
}else{
p = rear;
rear = rear->pPre;
if(rear != NULL){     //防止内存访问超界
rear->pNext = NULL;
}
q = p->data;

delete p;

return q;
}
}


//main.cpp 测试

#include"head.h"
#include"Deque.cpp"

int main()
{
Deque<int> que;

if( que.isEmpty()){
cout<<"isempty"<<endl;
}

que.EnDeque(11,1);
que.EnDeque(22,1);
que.EnDeque(33,1);
que.EnDeque(44,1);

que.EnDeque(11,2);
que.EnDeque(22,2);
que.EnDeque(33,2);
que.EnDeque(44,2);

while( !que.isEmpty()){
cout<<que.DeDeque(1)<<endl;
}

que.EnDeque(11,2);
que.EnDeque(22,2);
que.EnDeque(33,2);
que.EnDeque(44,2);

while( !que.isEmpty()){
cout<<que.DeDeque(2)<<endl;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: