队列类模板.docx
《队列类模板.docx》由会员分享,可在线阅读,更多相关《队列类模板.docx(17页珍藏版)》请在冰豆网上搜索。
队列类模板
封皮
(按学校要求手工填写)
成绩评定表
学生姓名
崔丁昴
班级学号
1203060115
专业
通信工程
课程设计题目
队列类模板的设计与实现
评
语
组长签字:
成绩
日期
20年月日
课程设计任务书
学院
信息科学与工程
专业
通信工程
学生姓名
崔丁昴
班级学号
1203060115
课程设计题目
队列类模板的设计与实现
实践教学要求与任务
进行队列类模板的设计并实现,队列采用循环队列实现,数据元素可以是char,int,float等多种数据类型,包括以下功能:
(1)实现初始化队列操作,建立一个空队列;
(2)实现清空队列操作;(3)实现判断队列是否为空的操作;
(4)实现求队列长度的操作;(5)实现返回队首元素的操作;
(6)实现入队操作;(7)实现出队操作;
(8)实现队列的遍历操作,输出队列的每个元素。
(9)将上述功能作为类的成员函数实现,编写主函数测试上述功能。
工作计划与进度安排
第17周:
分析题目,查阅课题相关资料,进行类设计、算法设计;
第18周:
程序的设计、调试与实现;
第19周:
程序测试与分析,撰写课程设计报告,进行答辩验收。
指导教师:
201年月日
专业负责人:
201年月日
学院教学副院长:
201年月日
摘要
很多自然科学和工程技术中的问题的解决最终都归结到队列问题的处理,模板是处理问题很经典的方法,由它改进、变形得到的类模板,是一种效率很高、较为常用的方法。
本文采用C++语言实现了对队列的各个操作,设计了队列类,采用VisualC++6.0的控制台工程和MFC工程分别实现了对队列的处理。
关键词:
队列;类模板;控制台工程;MFC工程
1.需求分析
1.应用类模板可以使类中的数据成员、成员函数的参数及成员函数的返回值能根据模板参数匹配情况取任意数据类型。
这种类型既可以是C++预定义的数据类型,也可以是用户自定义的数据类型。
2.队列在程序设计中也经常出现。
一个最典型的例子就是操作系统中的作业排队。
在允许多道程序运行的计算机系统中,同时有几个作业运行。
如果运行的结果都需要通过通道输出,那就要按请求输出的先后次序排队。
每当通道传输完毕可以接受新的输出任务时,队头的作业先从队列中退出作输出操作。
凡是申请输出的作业都从队尾进入队列。
2.算法基本原理
1.初始化一个循环队列。
和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个指针front和rear分别指示队列头元素及队列尾元素的位置。
2.实现清空队列操作。
直接让类Queue中的private成员全部清零。
从而实现队列的清空。
3.实现判断队列是否为空的操作。
如果该队列中成员count为零的话。
便直接输出该队列为空。
4.实现求队列长度的操作。
直接输出当前情况下的成员count的值。
5.实现返回队首元素的操作。
由于存在front直接指向着对首。
所以直接输出该队首元素即q[front]。
6.实现入队操作。
在count++的情况下。
让输入的值赋于q[rear++]。
即实现了在队尾插入的功能。
7.实现出队操作。
在count--的情况下。
让q[front]=q[front+1]。
即实现了在队首删除的功能。
8.实现队列的遍历操作。
输出队列的每个元素。
利用for循环直接输出q[]数组中所有的元素。
3.类设计
1.对于基类Queue来讲。
内部有私有成员和公有成员。
私有成员包括了描述一个队列必须的对首(front)、队尾(rear)、即队总数(count)。
另外还有用于存放队列数据的一个数组qlist[MaxQSize]。
公有成员则包括了各个函数。
Queue(void)为构造函数。
QDelete()为实现队列的删除的函数。
QInsert()为实现队列的插入的函数。
ClearQueue()为实现队列的清空的函数。
QLength()为计算求出队列的长度的函数。
QFront()为找到队列的队首元素的函数。
QEmpty()为判断队列是否为空的函数。
PrintQueue()输出队列的函数。
2.对于模板类来讲。
即template。
由于要求的是可以执行int、char、float三种类型的数据。
所以我们在主函数中定义了三个成员Queues、Queuez、Queuey。
用于分别调用这三种类型进行操作处理。
4.基于控制台的应用程序
整个程序分为三个大部分。
第一个部分即为对类Queue的定义。
第二个部分则是对类Queue中的各个成员函数进行定义。
第三个部分即为主函数,主函数中分别定义了int型、float型、char型的队列类型用于程序的选择及处理。
4.1类的初始定义
#include
#include
usingnamespacestd;
constintMaxQSize=20;
template//模板声明
classQueue{//类Queue的声明
private:
intcount;intfront;intrear;//类Queue私有成员声明
Tqlist[MaxQSize];
public:
Queue(void);//构造函数
voidQDelete();//实现队列的删除
voidQInsert();//实现队列的插入
voidClearQueue();//实现队列的清空
voidQLength();//计算求出队列的长度
voidQFront();//找到队列的队首元素
voidQEmpty();//判断队列是否为空
voidPrintQueue();//输出这个队列
};
4.2类的实现
template
Queue:
:
Queue(void):
front(0),rear(0),count(0)//初始化
{}
template
voidQueue:
:
QDelete(){//删除
Ttemp;
if(count==0)
{
cout<<"这是个空的队列!
"<exit
(1);
}
temp=qlist[front];
count--;
front=(front+1)%MaxQSize;
}
template
voidQueue:
:
QInsert(){//插入
chara;Titem;
if(count==MaxQSize)
{
cout<<"这是个满的队列!
"<exit
(1);
}
while
(1){
cout<<"输入数据请按Y/y不输入按N/n:
";
cin>>a;
if(a=='Y'||a=='y'){
cout<<"输入队列的数据:
"<cin>>item;
count++;
qlist[rear]=item;
rear=(rear+1)%MaxQSize;
}
elsebreak;
}
}
template
voidQueue:
:
QLength(){//长度
cout<<"该队列长度为:
"<}
template
voidQueue:
:
QFront(){//队首
cout<<"该队列队首元素为:
"<}
template
voidQueue:
:
ClearQueue(){//清空
count=0;front=0;rear=0;
}
template
voidQueue:
:
QEmpty(){//判断
if(count==0)cout<<"该队列为空!
"<elsecout<<"该队列不为空!
"<}
template
voidQueue:
:
PrintQueue(){//输出
inti;
for(i=0;icout<}
cout<}
intIfContinue(){//判断是否继续执行函数的函数
chari;
cout<<"继续执行函数请输入Y/y:
"<cin>>i;
if(i=='Y'||i=='y')return0;
elseexit
(1);
}
4.3主函数的设计
#include
#include
usingnamespacestd;
constintMaxQSize=20;
voidmain(){
intc,d;
Queues;Queuez;Queuey;
cout<<"这是个队列类模板的设计与实现的程序"<cout<<"请选择要处理的队列的数据类型:
"<cin>>c;
switch(c){
case1:
{while
(1){
cout<<"1.初始化2.删除3.长度4.队首元素5.清空6.判断7.输出"<cin>>d;
switch(d){
case1:
{s.QInsert();IfContinue();}break;
case2:
{s.QDelete();IfContinue();}break;
case3:
{s.QLength();IfContinue();}break;
case4:
{s.QFront();IfContinue();}break;
case5:
{s.ClearQueue();IfContinue();}break;
case6:
{s.QEmpty();IfContinue();}break;
case7:
{s.PrintQueue();IfContinue();}break;
default:
break;
}
}}break;
case2:
{while
(1){
cout<<"1.初始化2.删除3.长度4.队首元素5.清空6.判断7.输出"<cin>>d;
switch(d){
case1:
{z.QInsert();IfContinue();}break;
case2:
{z.QDelete();IfContinue();}break;
case3:
{z.QLength();IfContinue();}break;
case4:
{z.QFront();IfContinue();}break;
case5:
{z.ClearQueue();IfContinue();}break;
case6:
{z.QEmpty();IfContinue();}break;
case7:
{z.PrintQueue();IfContinue();}break;
default:
break;
}
}}break;
case3:
{while
(1){
cout<<"1.初始化2.删除3.长度4.队首元素5.清空6.判断7.输出"<cin>>d;
switch(d){
case1:
{y.QInsert();IfContinue();}break;
case2:
{y.QDelete();IfContinue();}break;
case3:
{y.QLength();IfContinue();}break;
case4:
{y.QFront();IfContinue();}break;
case5:
{y.ClearQueue();IfContinue();}break;
case6:
{y.QEmpty();IfContinue();}break;
case7:
{y.PrintQueue();IfContinue();}break;
default:
break;
}
}}break;
default:
break;
}
}
4.4基于控制台的应用程序测试
对int型数据进行程序运行结果如图1所示。
图1int型数据运行结果
对char型数据进行程序运行结果如图2所示。
图2char型数据运行结果
对float型数据进行程序运行结果如图3所示。
图3float型数据运行结果
5.1基于MFC的应用程序设计
5.1.1MFC程序界面设计
首先在VC中建立MFCAppWizard(exe)工程,名称为队列,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图4~5所示。
图4建立MFCAppWizard(exe)工程
图5建立基于对话框的应用程序
将对话框资源中的默认对话框利用工具箱改造成如下界面,如图6所示。
图6方程组求解程序界面设计
图6所示的界面中包含了2个StaticText控件,4个Button控件,和11个EditBox控件,控件的基本信息列表如下表1所示。
表1控件基本信息
控件类别
控件ID
控件Caption
说明
StaticText
IDC_STATIC
该队列为:
输入插入的数据:
Button
IDC_BUTTON_Read
读入数据
IDC_BUTTON_Del
删除数据
IDC_BUTTON_Empty
清空数据
IDC_BUTTON_Insert
进行插入
EditBox
IDC_EDIT_A00~IDC_EDIT_A10
队列的10个元素
IDC_EDIT_b0
用于插入的元素
5.1.2MFC程序代码设计
为了能够将对话框界面上的控件能够与代码联系起来,需要为11个EditBox控件建立MemberVariables,按Ctrl+w键进入MFCClassWizard界面,选择MemberVariables选项卡,可显示成员变量设置界面。
通过该界面设置与11个EditBox控件对应的成员变量,具体如表2所示。
表2控件基本信息
控件ID
成员变量类型
成员变量名称
IDC_EDIT_A00~IDC_EDIT_A10
int
dl_1~dl_10
IDC_EDIT_b0
int
cr_1
下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。
1.编写读入数据按钮的消息处理函数,实现将队列的数据刷新到界面上,具体代码如下:
voidCMyDlg:
:
OnInputNum(){
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
dl_1=7;dl_2=11;
dl_3=12;dl_4=15;
dl_5=22;dl_6=29;
dl_7=35;dl_8=42;
UpdateData(false);
}
2.编写删除数据的消息处理函数,实现数据删除,具体代码如下:
voidCMyDlg:
:
OnDeleteNum()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
if(dl_1!
=0)dl_1=0;
elseif(dl_2!
=0)dl_2=0;
elseif(dl_3!
=0)dl_3=0;
elseif(dl_4!
=0)dl_4=0;
elseif(dl_5!
=0)dl_5=0;
elseif(dl_6!
=0)dl_6=0;
UpdateData(false);
}
3.编写插入数据的消息处理函数,实现数据插入,具体代码如下:
voidCMyDlg:
:
OnInsertNum(){
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
if(dl_5==0)dl_5=cr_1;
elseif(dl_6==0)dl_6=cr_1;
elseif(dl_7==0)dl_7=cr_1;
elseif(dl_8==0)dl_8=cr_1;
elseif(dl_9==0)dl_9=cr_1;
elseif(dl_10==0)dl_10=cr_1;
UpdateData(false);
}
4.编写清空数据的消息处理函数,实现数据清空,具体代码如下:
voidCMyDlg:
:
OnEmptyNum(){
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
dl_1=0;dl_10=0;
cr_1=0;dl_2=0;
dl_3=0;dl_4=0;
dl_5=0;dl_6=0;
dl_7=0;dl_8=0;
dl_9=0;
UpdateData(false);
}
5.1.3基于MFC的应用程序测试
运行程序后,首先出现的界面如图8所示。
图8程序初始运行界面
单击读入数据按钮后,可将队列的数据在界面上显示出来,如图9所示。
图9读入数据后的界面
单击删除数据按钮,实现删除并将结果显示出来,如图10所示。
图10删除数据后的界面
单击插入数据按钮,实现插入并将结果显示出来,如图11所示。
图11插入数据后的界面
单击清空数据按钮,实现清空并将结果显示出来,如图12所示。
图12清空数据后的界面
结论
本次程序围绕基类Queue展开。
利用其成员函数进行了对队列的基本操作。
基本满足了题目所给的要求。
实现了对这个队列类的操作与处理。
本次课程设计作为编写Windows程序的初步尝试,能够实现程序的主要功能,可以说是取得了成功,然而好的程序绝不仅仅是只有功能性这一个指标,本此编写的MFC程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计要求来说,尚存在不足,主要包括以下几个方面。
1.在控制台的程序上。
我们可以满足类模板的要求。
即可以对int、char、float三种类型的数据进行处理。
而在MFC中。
我们只定义了int类型进行处理。
而且程序的可变性不够强。
2.在MFC的程序设计中。
我们并未严格的使数据成为一个队列。
只是象征性的表示了队首与队尾。
所以程序的满足要求性也不够。
3.对于MFC的应用程序。
由于MFC是依赖图形而存在的。
而我们所做的MFC的图形界面过于简单单一化了。
而且处理的灵活性不够。
对于这一点。
希望在以后学习中得到适当的加强。
参考文献
[1]谭浩强.C++面向对象程序设计.北京:
清华大学出版社,2006.1
[2]马秀丽,刘志妩,李筠.C语言程序设计.北京:
清华大学出版社,2008.3
[3]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2007