1、栈类模板的设计与实现封 皮(按学校要求手工填写) 成 绩 评 定 表学生姓名蒋倩雯班级学号1103060412专 业通信工程课程设计题目栈类模板的设计与实现评语组长签字:成绩日期 20 年 月 日课程设计任务书学 院信息科学与工程专 业通信工程学生姓名蒋倩雯班级学号1103060412课程设计题目栈类模板的设计与实现实践教学要求与任务进行栈类模板的设计并实现,栈采用链式存储结构,数据元素可以是char, int, float等多种数据类型,包括以下功能:(1) 实现初始化栈操作,建立一个空栈;(2) 实现清空栈操作;(3) 实现判断栈是否为空的操作;(4) 实现求栈长度的操作;(5) 实现返回
2、栈顶元素的操作;(6) 实现入栈操作;(7) 实现出栈操作;(8) 实现栈的遍历操作,输出栈的每个元素。(9) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。工作计划与进度安排 第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试与实现;第19周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师: 201 年 月 日专业负责人:201 年 月 日学院教学副院长:201 年 月 日摘 要本文采用C+语言实现了栈类模板的设计与实现,采用Visual C+ 6.0的控制台工程和MFC工程分别实现了栈类的初始化,清空栈,判断空栈,求栈长度,进栈出栈等
3、操作,通过对两种程序的测试结果表明:,两种程序均能正确的实现栈类模板的设计与实现。关键词:栈类模板;控制台工程;MFC工程目 录1 需求分析 12 算法基本原理 13 类设计 34 基于控制台的应用程序 34.1 类的接口设计 44.2 类的实现 54.3 主函数设计 64.4 基于控制台的应用程序测试 75 基于MFC的应用程序 85.1 基于MFC的应用程序设计 85.1.1 MFC程序界面设计 85.1.2 MFC程序代码设计 115.2基于MFC的应用程序测试 15结 论 18参考文献 191 需求分析(1) 本题目是栈类模板的设计与实现,栈类模板是采用C+语言将栈面向对象化,用C+语
4、言设计了一个栈类模板,类带变了某一批对象的共性与特征,是用来定义对象的一种抽象类型。(2) 设计的内容为:初始化栈操作,清空栈,判断是否空栈,求栈的长度,返回栈顶元素,入栈出栈,栈的遍历,输出元素。(3) 设计采用链式存储结构。2 算法基本原理 (1) 链式存储结构的栈称为链栈(Linked-stack),对于链栈而言,栈顶元素不断改变,程序只有使用一个top引用来记录当前栈顶元素即可。Top引用变了永远引用栈顶元素,在使用一个size变量记录当前栈中包含多少元素。进栈:对于链栈的进栈操作,需要让top引用指向新添加的元素,新元素的next引用执行原来的栈顶元素,同时记录栈内元素个数的size
5、变量+1出栈:对于链栈的出栈操作,需要将栈顶元素弹出栈,程序需要让top引用执行原栈顶元素的下一个元素,并释放原来的栈顶元素,同时记录下栈内元素size变量-1.(2)基本操作:InitStack(S) 操作前提:S为未初始化的栈 操作结果:将S初始化为空栈 ClearStacck(S) 操作前提:栈S已经存在 操作结果:将栈S置成空栈IsEmpty(S) 操作前提:栈S已经存在 操作结果:判断栈空函数,若S为空栈,则函数值为TRUE,否则为FALSEStacklength(S) 操作前提:栈S已经存在 操作结果:返回栈中元素的个数Push(S,x) 操作前提:栈S已经存在 操作结果:在S的顶
6、部插入元素,若S栈未满,将元素插入栈顶位置。若已满,返回FALSE,表示操作失败,否则返回TRUE。(3)首先要定义一个类为stack,其类型名为Th,操作分为九个步骤,具体步骤如下:第1步,实现栈初始化操作,建立一个空栈stack。第2步,实现清空栈的操作,执行clear语句,例如本题输入元素为5、7、9,执行clear语句,将其清空。第3步,实现判断栈是否为空的操作,执行 empty判断语句,对其进行判断,未清空前输出true,清空后输出false。第4步,实现求栈长度的操作,例如本题输入元素5、7、9执行出栈操作后删除栈顶元素9,输出长度为2。第5步,实现返回栈顶元素操作,本题输入元素5
7、、7、9依次进栈顺序为9、7、5,然后执行返回栈顶语句,返回栈顶元素9。第6步,实现入栈操作,例如本题输入元素5、7、9后依次入栈,为9、7、5。第7步,实现出栈操作,本题中当执行返回栈顶元素9后,只剩下元素7、5,然后依次出栈。第8步,实现栈的遍历操作输出栈的每一个元素,此题输出为9、7。第9步,将上述功能作为类的成员函数实现,编写主函数测试上述功能。3 类设计从上面的算法分析可以看到,本设计面临的主要问题是将这些要求作为类的成员函数,可以定义一个类stack,然后将这些要求作为该类的成员函数,该类主要分为公有变量和私有变量两部分,执行过程主要是公有变量里面的八个成员函数,然后分别利用主函数
8、里面的函数分别对他们依次调用,完成对类的操作。类公有变量及私有变量相互关系如图1所示。 图1 stack类和公有变量及私有变量UML图形表示4 基于控制台的应用程序 整个程序首先定义了一个类stack,然后在公有变量中分别定义九个成员函数,首先是建立一个空栈stack,随后实现清空栈操作,即执行void clear(),后判断栈是否为空,执行bool empty()函数,然后是求栈长度,执行size()函数,在返回栈顶元素,执行the top()const,后分别是实现入栈及出栈操作,最后实现栈的遍历,输出栈的每一个元素,在私有变量中主要是对栈的检验,main函数为程序的主函数,通过调用成员函
9、数些实现程序的运行。4.1 类的接口设计/Linequ.h文件,实现类的声明#include using std:cout;using std:endl;templatestruct node _Th value; node *next; node(const _Th &data = _Th(), node *link = 0) : value(data), next(link) ; template class stackpublic: stack() header = new node(_Th(), 0); void clear() while (!empty() pop(); bool
10、empty() const return !header-next; unsigned int size() const unsigned int s = 0; for (node *cur = header; cur-next; cur = cur-next) +s; return s; _Th top() const check_for_validity(); return header-value; void push(const _Th &element) node *new_node = create_node(element, header); header = new_node;
11、 void pop() if (empty() return; node *peek = header; header = header-next; delete peek; void print_all() const for (node *cur = header; cur-next; cur = cur-next) cout value ; cout endl; private: node *header; template static node* create_node(const _Type &value, node *n) return new node(value, n); v
12、oid check_for_validity() const if (empty() throw 0; / should throw something more meaningful ;在开头的程序中定义一个结构体,然后定义了类stack,公有变量中包含了全部的成员函数,并且基类继承来的成员全部可以访问,而类中的私有变量时不可访问的。4.2 类的实现/Linequ.cpp文件,类实现#include linequ.h /包含类的声明头文件/stack类的实现stack() header = new node(_Th(), 0); void clear() while (!empty() po
13、p(); bool empty() const return !header-next; unsigned int size() const unsigned int s = 0; for (node *cur = header; cur-next; cur = cur-next) +s; return s; _Th top() const check_for_validity(); return header-value; void push(const _Th &element) node *new_node = create_node(element, header); header =
14、 new_node; void pop() if (empty() return; node *peek = header; header = header-next; delete peek; void print_all() const for (node *cur = header; cur-next; cur = cur-next) cout value ; cout endl;在类的成员函数实现过程中,因为无外部接口,所以主要是在基类内部实现,通过主函数调用调用基类中的成员函数依次完成操作。首先是建立一个空栈,在主函数中输入了3个元素为5、7、9,然后实现清空栈操作,在判断栈是否为空
15、,因为输入了元素,所以输出false,在求栈长度,求栈顶元素后,输出9,所以栈长度为2,在分别实现入栈以及出栈操作,实现栈的遍历,输出元素为7、5。4.3 主函数设计/main.cpp主函数#include linequ.hint main() stack s; s.push(5); s.push(7); s.push(9); s.print_all(); cout top: s.top() endl; s.pop(); cout top: s.top() endl; s.print_all(); cout size: s.size() endl; cout is empty: (s.empt
16、y() ? true : false) endl; s.clear(); cout is empty: (s.empty() ? true : false) next; 函数和建立一个空栈stack() header = new node(_Th(), 0); 函数注释掉,因为在图形界面的程序上已经不需要连个函数承担输出功能了; 将输出栈void pop() 函数加入参数int m_l1变成void pop(int m_l1),以实现将所求结果显示在对话框中,并最终完成在对话框界面上的显示;在对话框类的实现文件123.cpp中加入#include .h,以实现在该文件中可使用stack类。具体
17、编写代码如下:实现清空栈操作void CMy12315Dlg:OnButton1() UpdateData(true); void clear clear m_l1; UpdateData(false); 判断栈空操作void CMy12315Dlg:OnButton2() / TODO: Add your control notification handler code here UpdateData(true); if(m_l1=NULL|m_l1=0) m_l2=null; else m_l2=not null; UpdateData(false); 实现求栈u长度的操作,具体代码如下
18、:void CMy12315Dlg:OnButton3() UpdateData(true); m_l1=(char)(m_l1); m_l3=strlen(m_l1); UpdateData(false); / TODO: Add your control notification handler code here 输出栈的操作,代码如下:void CMy12315Dlg:OnButton4() UpdateData(true);void pop(); m_l4=pop(int m_l1); / TODO: Add your control notification handler cod
19、e hereUpdateData(false); 返回栈顶元素,代码如下void CMy12315Dlg:OnButton5() UpdateData(true);The top() const check_for_validity(); m_l5=m_l1-header;return header-value; UpdateData(false); 退出按钮比较简单,代码如下:void CMy12315Dlg:OnButton6()/ TODO: Add your control notification handler code hereOnOK();5.2基于MFC的应用程序测试运行程序
20、后,首先出现的界面如图8所示。图8 程序初始运行界面单击读入数据按钮后,可将系数矩阵A和方程组右端项b的数据在界面上显示出来,如图9所示。图9 读入数据后的界面单击计算求解按钮,实现求解并将解显示出来,如图10所示。图10 输出后的界面 单击退出按钮后,程序能够正常实现退出。 结 论本次课程设计论文主要分为五部分,第一部分主要介绍了类模板的需求。第二部分介绍了算法的基本原理,第三部分主要是类设计,介绍了类的基本结构,第四部分是基于控制台的应用程序,第五部分是基于MFC的应用程序设计。整个程序中的栈类模板是通过定义普通类实现的,在程序开始定义一个结构体,然后定义类整个程序的要求是将所有的功能作为
21、类的成员函数,数据成员可以是、多种数据类型,在类里分别定义了公有变量和私有变量,在公有变量中定义了八个成员函数,分别为实现初始化操作,建立一个空栈,实现清空栈操作,判断栈是否为空操作,实现求栈长度,实现返回栈顶元素操作,实现入栈操作,实现出栈操作,实现栈的遍历操作,输出栈的每一个元素,通过对这些成员函数的定义,使类更加的具体化,特殊化达到了对问题的有效描述和处理,程序的问题访问也是根据问题需要而设计的,私有变量的数据成员维护着数据的正确性,在主函数中,先是分别定义了一组数据,然后在定义了调用函数,通过这些函数的定义,使程序更加的清晰,易懂,从而理解的更加透彻,而公有变量中的所有成员函数都可以被
22、主函数调用,使程序的执行更加的简洁,通过主函数,公有变量和私有变量的相互作用,共同实现所有的功能。在进行设计MFC程序时,由于MFC程序与DOS界面程序编写的不同,需要知道图形界面设计,图形界面输入输出以及界面元素和代码对应转换等问题,而这些问题在DOS界面程序中是不存在的。本次设计MFC程序是编写windows程序的初步尝试,能够实现程序的主要功能。编写的MFC程序虽然能实现所需功能,但是从面向对象程序设计理念和图形界面设计要求来说,还存在不足之处,主要为以下几点:(1)设计完成MFC程序后需要改动源代码时不容易找到原程序,需要建立文件便于查找。(2)效率不高,有太多成员变量和成员函数,功能
23、相同可以合并或删除。参考文献1 谭浩强著.C+面向对象程序设计.北京,清华大学出版社,20052李晓燕,数据结构初步。北京:中国财政出版社。19963 李庆扬,王能超,易大义. 数值分析. 湖北:华中理工大学出版社,1986:55-724 Decoder 编著.C/C+程序设计.北京:中国铁道出版社,20025蔡子经,施伯乐.数据结构教程.上海:复旦大学出版社,19946 殷人昆,数据结构(用面向对象方法与C+描述).北京:清华大学出版社,19977 唐策善,李龙激,黄刘生,数据结构用C+语言描述。 北京:高等教育出版社。1995 8 陈志泊,王春玲. 面向对象的程序设计语言C+. 北京:人民邮电出版社,2002:115-130
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1