C++数据结构之链队列的实现

#ifndef__LK_QUEUE_H__
#define__LK_QUEUE_H__
#include"utility.h" //实用程序软件包
#include"node.h" //结点类
//链队列类
template
class LinkQueue
{
protected:
//链队列实现的数据成员:
Node*front,*rear //队头队尾指针
//辅助函数:
Void Init(); //初始化队列
public:
//抽象数据类型方法声明及重载编译系统默认方法声明
LinkQueue(); //无参数的构造函数
virtual~LinkQueue(); //析构函数
int Length() const; //求队列长度
bool Empty() const; //判断队列是否为空
void Clear(); //将队列清空
void Traverse(void(*Visit)(const ElemType &)) const; //遍历队列
StatusCode OutQueue(ElemType &e); //出队操作
StatusCode GetHead(ElemType &e) const; //取队头操作
StatusCode InQueue(const ElemType &e); //入队操作
LinkQueue(const LinkQueue©); //复制构造函数
LinkQueue&operator=(const LinkQueue©); //赋值语句重载
};
//链队列类的实现部分
template
void LinkQueue::Init()
//操作结果:初始化队列
{
rear=front=new Node; //生成头结点
}
template
LinkQueue::LinkQueue()
//操作结果:构造一个空队列
{
Init();
}
template
LinkQueue::~LinkQueue()
//操作结果:销毁队列
{
Clear();
}
template
int LinkQueue::Length() const
//操作结果:返回队列长度
{
int count=0; //计数器
for (Node*tmpPtr=front->next;tmpPtr!=NULL;tmpPtr=tmpPtr->next)
{
//用tmpPtr依次指向每个元素
count++; //对队列每个元素进行计数
}
return count;
}
template
void LinkQueue::Clear()
//操作结果:清空队列
{
ElemType tmpElem; //临时元素值
while(Length()>0)
{//队列非空,则出列
OutQueue(tmpElem);
}
}
template
void LinkQueue::Traverse(void(*Visit)(const ElemType&))const
//操作结果:依次对队列的每个元素调用函数(*Visit)
{
for (Node*tmpPtr=front->next;tmpPtr!=NULL;tmpPtr=tmpPtr->next)
{
(*Visit)(tmpPtr->data);
}
}
template
StatusCode LinkQueue::OutQueue(ElemType &e)
//操作结果:如果队列非空,那么删除队头元素,并用e返回其值,函数返回SUCCESS,否则函数返回UNDER_FLOW
{
if(!Empty())
{//队列非空
Node*tmpPtr=front->next;//指向队头元素
e=tmpPtr->data; //用e返回队头元素
front->next=tmpPtr->next; //用front指向下一元素
if(rear==tmpPtr)
{//表示出队前队列中只有一个元素,出队后为空列
rear=front;
}
delete tmpPtr; //释放出队的结点
return SUCCESS;
}
else
{//队列为空
return UNDER_FLOW;
}
}
template
StatusCode LinkQueue::GetHead(ElemType &e) const
//操作结果:如果队列非空,那么用e返回队头元素,函数返回SUCCESS

,否则函数返回UNDER_FLOW
{
if(!Empty())
{ //队列非空
Node*tmpPtr=front->next; //指向队头元素
e=tmpPtr->data; //用e返回队头元素
return SUCCESS;
}
else
{ //队列非空
return UNDER_FLOW;
}
}
template
StatusCode LinkQueue::InQueue(const ElemType &e)
//操作结果:插入元素e为新的队尾,返回SUCCESS
{
Node*tmpPtr=new Node(e); //生成新结点
rear->next=tmpPtr; //新结点追加在队尾
rear=tmpPtr; //rear指向新队尾
return SUCCESS;
}
template
LinkQueue::LinkQueue(const LinkQueue©)
//操作结果:由队列copy构造新队列——复制构造函数
{
Init();
for(Node*tmpPtr=copy.front->next;tmpPtr!=NULL;tmpPtr=tmpPtr->next)
{ //对copy队列每个元素对当前队列作入队列操作
InQueue(tmpPtr->data);
}
}
template
LinkQueue&LinkQueue::operator=(const LinkQueue©)
//操作结果:将队列copy赋值给当前队列——赋值语句重载
{
if(©!=this)
{
Clear();
for(Node*tmpPtr=copy.front->next;tmpPtr!=NULL;tmpPtr=tmpPtr->next)
{ //对copy队列每个元素对当前队列作入队列操作
InQueue(tmpPtr->data);
}
}
return *this;
}
#endif

相关文档
最新文档