C++数据结构之链队列的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#ifndef__LK_QUEUE_H__
#define__LK_QUEUE_H__
#include"utility.h" //实用程序软件包
#include"node.h" //结点类
//链队列类
template
class LinkQueue
{
protected:
//链队列实现的数据成员:
Node
//辅助函数:
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
};
//链队列类的实现部分
template
void LinkQueue
//操作结果:初始化队列
{
rear=front=new Node
}
template
LinkQueue
//操作结果:构造一个空队列
{
Init();
}
template
LinkQueue
//操作结果:销毁队列
{
Clear();
}
template
int LinkQueue
//操作结果:返回队列长度
{
int count=0; //计数器
for (Node
{
//用tmpPtr依次指向每个元素
count++; //对队列每个元素进行计数
}
return count;
}
template
void LinkQueue
//操作结果:清空队列
{
ElemType tmpElem; //临时元素值
while(Length()>0)
{//队列非空,则出列
OutQueue(tmpElem);
}
}
template
void LinkQueue
//操作结果:依次对队列的每个元素调用函数(*Visit)
{
for (Node
{
(*Visit)(tmpPtr->data);
}
}
template
StatusCode LinkQueue
//操作结果:如果队列非空,那么删除队头元素,并用e返回其值,函数返回SUCCESS,否则函数返回UNDER_FLOW
{
if(!Empty())
{//队列非空
Node
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
//操作结果:如果队列非空,那么用e返回队头元素,函数返回SUCCESS
,否则函数返回UNDER_FLOW
{
if(!Empty())
{ //队列非空
Node
e=tmpPtr->data; //用e返回队头元素
return SUCCESS;
}
else
{ //队列非空
return UNDER_FLOW;
}
}
template
StatusCode LinkQueue
//操作结果:插入元素e为新的队尾,返回SUCCESS
{
Node
rear->next=tmpPtr; //新结点追加在队尾
rear=tmpPtr; //rear指向新队尾
return SUCCESS;
}
template
LinkQueue
//操作结果:由队列copy构造新队列——复制构造函数
{
Init();
for(Node
{ //对copy队列每个元素对当前队列作入队列操作
InQueue(tmpPtr->data);
}
}
template
LinkQueue
//操作结果:将队列copy赋值给当前队列——赋值语句重载
{
if(©!=this)
{
Clear();
for(Node
{ //对copy队列每个元素对当前队列作入队列操作
InQueue(tmpPtr->data);
}
}
return *this;
}
#endif