cout<<"请选择:
";
cin>>select;//选择功能
switch(select)
{
case1:
StandInALine();//排队--输入病人的病历号,加入到病人队列中
break;
case2:
Cure();//就诊--病人排队队列中最前面的病人就诊,并将其从队列中删除
break;
case3:
Display();//查看排队--从队首到队尾列出所有的排队病人的病历号
break;
}
}
}
#endif
//头文件:
lk_queue.h
#ifndef__LK_QUEUE_H__
#define__LK_QUEUE_H__
#include"utility.h"//实用程序软件包
#include"node.h"//结点类模板
//链队列类模板
template
classLinkQueue
{
protected:
//链队列实现的数据成员:
Node*front,*rear;//队头队尾指指
//辅助函数模板:
voidInit();//初始化队列
public:
//抽象数据类型方法声明及重载编译系统默认方法声明:
LinkQueue();//无参数的构造函数模板
virtual~LinkQueue();//析构函数模板
intLength()const;//求队列长度
boolEmpty()const;//判断队列是否为空
voidClear();//将队列清空
voidTraverse(void(*visit)(constElemType&))const;//遍历队列
StatusCodeOutQueue(ElemType&e);//出队操作
StatusCodeGetHead(ElemType&e)const;//取队头操作
StatusCodeInQueue(constElemType&e);//入队操作
LinkQueue(constLinkQueue©);//复制构造函数模板
LinkQueue&operator=(constLinkQueue©);//重载赋值运算符
};
//链队列类模板的实现部分
template
voidLinkQueue:
:
Init()
//操作结果:
初始化队列
{
rear=front=newNode;//生成头结点
}
template
LinkQueue:
:
LinkQueue()
//操作结果:
构造一个空队列
{
Init();
}
template
LinkQueue:
:
~LinkQueue()
//操作结果:
销毁队列
{
Clear();
}
template
intLinkQueue:
:
Length()const
//操作结果:
返回队列长度
{
intcount=0;//计数器
for(Node*tmpPtr=front->next;tmpPtr!
=NULL;tmpPtr=tmpPtr->next)
{//用tmpPtr依次指向每个元素
count++;//对栈每个元素进行计数
}
returncount;
}
template
boolLinkQueue:
:
Empty()const
//操作结果:
如队列为空,则返回true,否则返回false
{
returnrear==front;
}
template
voidLinkQueue:
:
Clear()
//操作结果:
清空队列
{
ElemTypetmpElem;//临时元素值
while(Length()>0)
{//队列非空,则出列
OutQueue(tmpElem);
}
}
template
voidLinkQueue:
:
Traverse(void(*visit)(constElemType&))const
//操作结果:
依次对队列的每个元素调用函数(*visit)
{
for(Node*tmpPtr=front->next;tmpPtr!
=NULL;
tmpPtr=tmpPtr->next)
{//对队列每个元素调用函数(*visit)
(*visit)(tmpPtr->data);
}
}
template
StatusCodeLinkQueue:
:
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;
}
deletetmpPtr;//释放出队的结点
returnSUCCESS;
}
else
{//队列为空
returnUNDER_FLOW;
}
}
template
StatusCodeLinkQueue:
:
GetHead(ElemType&e)const
//操作结果:
如果队列非空,那么用e返回队头元素,返回SUCCESS,
//否则返回UNDER_FLOW,
{
if(!
Empty())
{//队列非空
Node*tmpPtr=front->next;//指向队列头素
e=tmpPtr->data;//用e返回队头元素
returnSUCCESS;
}
else
{//队列为空
returnUNDER_FLOW;
}
}
template
StatusCodeLinkQueue:
:
InQueue(constElemType&e)
//操作结果:
插入元素e为新的队尾,返回SUCCESS
{
Node*tmpPtr=newNode(e);//生成新结点
rear->next=tmpPtr;//新结点追加在队尾
rear=tmpPtr;//rear指向新队尾
returnSUCCESS;
}
template
LinkQueue:
:
LinkQueue(constLinkQueue©)
//操作结果:
由队列copy构造新队列——复制构造函数模板
{
Init();
for(Node*tmpPtr=copy.front->next;tmpPtr!
=NULL;
tmpPtr=tmpPtr->next)
{//对copy队列每个元素对当前队列作入队列操作
InQueue(tmpPtr->data);
}
}
template
LinkQueue&LinkQueue:
:
operator=(constLinkQueue©)
//操作结果:
将队列copy赋值给当前队列——重载赋值运算符
{
if(©!
=this)
{
Clear();
for(Node*tmpPtr=copy.front->next;tmpPtr!
=NULL;
tmpPtr=tmpPtr->next)
{//对copy队列每个元素对当前队列作入队列操作
InQueue(tmpPtr->data);
}
}
return*this;
}
#endif
//头文件:
node.h
#ifndef__NODE_H__
#define__NODE_H__
//结点类模板
template
structNode
{
//数据成员:
ElemTypedata;//数据域
Node*next;//指针域
//构造函数模板:
Node();//无参数的构造函数模板
Node(ElemTypeitem,Node*link=NULL);//已知数据元素值和指针建立结构
};
//结点类模板的实现部分
template
Node:
:
Node()
//操作结果:
构造指针域为空的结点
{
next=NULL;
}
template
Node:
:
Node(ElemTypeitem,Node*link)
//操作结果:
构造一个数据域为item和指针域为link的结点
{
data=item;
next=link;
}
#endif
//头文件:
utility.h
#ifndef__UTILITY_H__//如果没有定义__UTILITY_H__
#define__UTILITY_H__//那么定义__UTILITY_H__
//实用程序软件包
#ifdef_MSC_VER//表示是VC
#if_MSC_VER==1200//表示VC6.0
//标准库头文件
#include//标准串和操作
#include//标准流操作
#include//极限
#include//数学函数
#include//文件输入输出
#include//字符处理
#include//日期和时间函数
#include//标准库
#include//标准输入输出
#include//输入输出流格式设置
#include//支持变长函数参数
#include//支持断言
#else//其它版本的VC++
//ANSIC++标准库头文件
#include//标准串和操作
#include//标准流操作
#include//极限
#include//数学函数
#include//文件输入输出
#include//字符处理
#include//日期和时间函数
#include//标准库
#include//标准输入输出
#include//输入输出流格式设置
#include//支持变长函数参数
#include//支持断言
usingnamespacestd;//标准库包含在命名空间std中
#endif//_MSC_VER==1200
#else//非VC
//ANSIC++标准库头文件
#include//标准串操作
#include//标准流操作
#include//极限
#include//数据函数
#include//文件输入输出
#include//字符处理
#include//日期和时间函数
#include//标准库
#include//标准输入输出
#include//输入输出流格式设置
#include//支持变长函数参数
#include//支持断言
usingnamespacestd;//标准库包含在命名空间std中
#endif//_MSC_VER
//自定义类型
enumStatusCode{SUCCESS,FAIL,UNDER_FLOW,OVER_FLOW,RANGE_ERROR,DUPLICATE_ERROR,
NOT_PRESENT,ENTRY_INSERTED,ENTRY_FOUND,VISITED,UNVISITED};
//宏定义
#defineDEFAULT_SIZE1000//缺省元素个数
#defineDEFAULT_INFINITY1000000//缺省无穷大
//实用函数(模板)声明
staticcharGetChar(istream&inStream=cin);//从输入流inStream中跳过空格及制表符获取一字符
staticboolUserSaysYes();//当用户肯定回答(yes)时,返回true,用户否定回答(no)时,返回false
staticvoidSetRandSeed();//设置当前时间为随机数种子
staticintGetRand(intn);//生成0~n-1之间的随机数
staticintGetRand();//生成随机数
staticintGetPoissionRand(doubleexpectValue);//生成期望值为expectValue泊松随机数
template
voidSwap(ElemType&e1,ElemType&e2);//交换e1,e2之值
template
voidDisplay(ElemTypeelem[],intn);//显示数组elem的各数据元素值
template
voidWrite(constElemType&e);//显示数据元素
//实用类
classTimer;//定时器类Timer
classError;//通用异常类
staticcharGetChar(istream&inStream)
//操作结果:
从输入流inStream中跳过空格及制表符获取一字符
{
charch;//临时变量
while((ch=(inStream).peek())!
=EOF//文件结束符(peek()函数从输入流中接受1
//字符,流的当前位置不变)
&&((ch=(inStream).get())==''//空格(get()函数从输入流中接受1字符,流
//的当前位置向后移1个位置)
||ch=='\t'));//制表符
returnch;//返回字符
}
staticboolUserSaysYes()
//操作结果:
当用户肯定回答(yes)时,返回true,用户否定回答(no)时,返回false
{
charch;//用户回答字符
boolinitialResponse=true;//初始回答
do
{//循环直到用户输入恰当的回答为止
if(initialResponse)
{//初始回答
cout<<"(y,n)?
";
}
else
{//非初始回答
cout<<"用y或n回答:
";
}
while((ch=GetChar())=='\n');//跳过空格,制表符及换行符获取一字符
initialResponse=false;
}while(ch!
='y'&&ch!
='Y'&&ch!
='n'&&ch!
='N');
while(GetChar()!
='\n');//跳过当前行后面的字符
if(ch=='y'||ch=='Y')returntrue;
elsereturnfalse;
}