实验二之队列精编版.docx
《实验二之队列精编版.docx》由会员分享,可在线阅读,更多相关《实验二之队列精编版.docx(12页珍藏版)》请在冰豆网上搜索。
实验二之队列精编版
数据结构实验报告
评分
满分——5分
学号:
2015111898姓名:
许明华专业:
计算机科学与技术
知识范畴:
栈与队列完成日期:
2017年03月31日
实验题目:
基于循环队列的排队买票模拟程序
实验内容及要求:
编程建立循环队列存储结构,对排队买票过程进行模拟。
要求程序在控制台屏幕上显示字符菜单:
1.排队——输入新到达的买票人姓名,加入买票队列中;
2.售票——排队队列中最前面的人购票成功,显示信息并将其从队列中删除;
3.查看队列——从队首到队尾依次列出所有正在排队买票人的姓名;
4.结束——退出系统。
“排队”时,若队满,应提示等待(排队不成功);
“售票”时,若队空,应提示无人排队(售票失败)。
实验目的:
掌握循环队列的基本操作。
数据结构设计简要描述:
序言:
这是本学期第二个实验,实验主要目的是让我们熟悉循环队列的创建,入队,出队等操作
数据结构设计:
整个实验可分为一个大的模块,其中包含八个函数模块:
菜单显示函数(Menu),初始化队列(InitQueue),添加购票人到队列(enQueue),删除购票成功的人(dlQueue),输出队列中所有人的信息(Putall_Queue),读取到文件函数(write_file)以及判断队空和队满(Empty、Full)共八个函数模块,队列用结构体创建,其中包含整型(int)的队列容量n,队头指针top,队尾指针tail和队列计数变量c,以及string类型的数组elem;最后通过c++语言ofstream将购票人信息保存到文件中和c语言exit(0)退出系统,便完成了整个模拟买票系统的创建。
算法设计简要描述:
1,首先用结构体创建一个保存购票人的信息队列,为string类型;
2,进行队列初始化,为string类型数组new一个动态内存,将队头和队尾置0,并将从键盘输入的n值赋值给队列容量;
3,判断队列为空或者为满,成立返回真,否则返回假;
4,添加购票人信息,将新增的购票人信息添加到队列中去,为避免“假溢”以及搬动元素的操作,在入队时采用r=(r+1)%n,则数组在逻辑上成为圆环形,也即是采用循环队列;
5,将购票成功的人信息显示出来并将其从队列中移除去,也是采用r=(r+1)%n循环队列来实现;
6,输出显示所有正在购票人信息,先判断若没有人排队,则显示无人购票,否则采用循环队列输出所有人信息;
7,采用ofstream将所有正在购票人信息读取到文件中去保存;
输入/输出设计简要描述:
1,排队:
输入购票人“姓名”,若队满,则输出“排队不成功,请等待!
”,否则输出“成功加入到购票队列中去”;
2,售票:
调用售票函数时,直接输出排队队列中最前面的人购票成功,并输出其“编号和姓名”,并显示将其从队列中删除;
3,查看所有队列:
调用查看所有队列函数,输出所有正在排队的人的信息;
4,写入到文件:
输入文件名,若队为空,显示“无人购票,写入失败!
”,否则输出成功将其写入到文件中去;
5,退出系统:
调用退出函数,成功推出系统;
编程语言说明:
1,编程软件,CodeBlocks16.0;
2,代码均用C++语言实现;
3,输入输出采用C++语言的cout和cin函数;
4,文件读写采用ofstream类型;
5,程序注释采用C/C++规范;
主要函数说明:
intMenu(void);//菜单显示函数
voidInitQueue(Queue,int);//初始化队列
intenQueue(Queue,ElemTp);//在队列中添加新的乘客
intdlQueue(Queue);//将购票成功的人从队列中删除
voidPutall_Queue(Queue);//输出显示所有队列中的购票人的信息
boolEmpty(Queue);//判断队列是否为空
boolFull(Queue);//判断队列是否满
voidwrite_file(Queue);//读取到文件中
程序测试简要报告:
见截图:
1,
2,
3,
4,
5,
6,
7,
8,
9,
源程序代码:
#include
#include
#include
#include
#include
usingnamespacestd;
typedefstringElemTp;//ElemTPy一个string类型
typedefstructnode
{
ElemTp*elem;
intn;//队列容量
inttop;//队头指针
inttail;//队尾指针
intc;//队列计数变量
}*Queue;
//函数声明
intMenu(void);//菜单显示函数
voidInitQueue(Queue,int);//初始化队列
intenQueue(Queue,ElemTp);//在队列中添加新的乘客
intdlQueue(Queue);//将购票成功的人从队列中删除
voidPutall_Queue(Queue);//输出显示所有队列中的购票人的信息
boolEmpty(Queue);//判断队列是否为空
boolFull(Queue);//判断队列是否满
intwrite_file(Queue);//读取到文件中
//队列初始化
voidInitQueue(Queueq,intn)
{
q->elem=newElemTp[q->n];//先分配一个M大的内存空间
q->top=q->tail=0;//将队头和队尾置空
q->n=n+1;//从键盘输入一个队列的长度,并将其赋值给队列长度,这样就可以人为的控制队列的长度
}
//队列为满
boolFull(Queueq)
{
return(q->tail+1)%q->n==(q->top+q->n)%q->n;//判断队是否满
}
//队为空
boolEmpty(Queueq)
{
if(q->top==q->tail)//若果队头等于队尾的话,就返回真,说明队空
{
returntrue;
}
returnfalse;
}
//添加购票人信息
intenQueue(Queueq,ElemTpname)
{
if(Full(q))
{
cout<<"排队不成功,请等待!
\n"<getch();
return0;
}
else
{
q->elem[q->tail]=name;//添加排队人编号到队列中去
q->tail=(q->tail+1)%q->n;//队尾指针进行加1扫描
cout<<"成功加入购票队列中!
请按任意键返回.....\n"<}
getch();//获得键盘上一个输入,
}
//删除已购票成功的人信息
intdlQueue(Queueq)
{
if(Empty(q))
{
cout<<"无人排队,售票失败!
\n请按任意键返回.....\n"<return0;
}
ElemTpname;//定义一个ElemTp类型来保存退出队列的购票人姓名
inti=q->top+1;
name=q->elem[q->top];//队头元素出队并保存在Num1中,以便打印显示
cout<<"购票成功!
\n购票人信息为:
\n\n编号:
"<
"<\n"<q->top=(q->top+1)%q->n;//队头指针指向下一个队头元素,以让下一个人开始购票
cout<<"\n请按任意建返回.....\n"<}
//打印所有正在购票人信息
voidPutall_Queue(Queueq)
{
q->c=q->top;//这里用一个计数变量来保存队列,而不直接用q->top,否则打印一次就相当于让一位购票人出队,而不是打印所有购票人信息
inti=q->top+1;
cout<<"所有正在购票人信息:
\n"<if(q->c==q->tail)
{
cout<<"无人购票!
"<}
else
{
while(q->c!
=q->tail)
{
cout<<"\n编号:
"<
"<elem[q->c]<q->c=(q->c+1)%q->n;
}
}
cout<cout<<"\n请按任意建返回.....\n"<getch();
}
//读取到文件中去
voidwrite_file(Queueq)
{
ofstreamin;
charfilename[10];
cout<<"\n请输入你想写入的文件名:
\n";
cin>>filename;//得到写入文件的文件名
in.open(filename);//创建一个文件名,用于保存我们要写入的数据
q->c=q->top;//这里用一个计数变量来保存队列,而不直接用q->top,否则打印一次就相当于让一位购票人出队,而不是打印所有购票人信息
inti=q->top+1;
if(q->c==q->tail)
{
cout<<"无人购票!
不能读取到文件!
"<}
else
{
while(q->c!
=q->tail)
{
in<<"编号:
"<
"<elem[q->c]<q->c=(q->c+1)%q->n;
}
cout<<"成功读取所有购票人信息!
";
}
in.close();//关闭文件
cout<cout<<"\n请按任意建返回.....\n"<getch();
}
//菜单输出显示,共有排队,售票,查看队列以及结束购票等四项功能
intMenu(void)
{
cout<<"\n***欢迎使用模拟排队买票窗口***\n";
cout<<"\n-----------------------------\n";
cout<<"\n||1.排队||\n";
cout<<"\n||2.售票||\n";
cout<<"\n||3.查看队列||\n";
cout<<"\n||4.结束||\n";
cout<<"\n||5.读取到文件||\n";
cout<<"\n-----------------------------\n";
}
//主函数调用
intmain()
{
Queuep=newstructnode;//创建一个新的队列
intn;//定义队列最大的长度
cout<<"请输入队列的最大长度(输入0返回):
\n";
cin>>n;//输入队列的长度
while(n==0)
{