数据结构上机实验报告.docx
- 文档编号:11645830
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:27
- 大小:1.32MB
数据结构上机实验报告.docx
《数据结构上机实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构上机实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构上机实验报告
数据结构上机实验报告
欢迎交流(760135448@)
2015年11月20日
上机实验一
1.上机实验简介
1)实验目的
当用户输入一个合法的算术表达式后,能够返回正确的结果。
能够计算的运算符包括:
加、减、乘、除、括号;能够计算的操作数要求在实数范围内;对于异常表达式能给出错误提示。
2)开发工具
C++语言,MicrosoftVisualC++6.0开发软件
3)测试数据
分别对一位数、多位数以及小数的四则运算进行检验,我选取了下面几个式子:
3+4-5*(12/6)#
100+20*(26/13)#
1.3+3.4-(5.6/1.2)#
正确计算结果应分别为-3.00、140.00与0.03,用所做程序计算并与正确结果比较。
2.算法说明
(1)概要说明:
为实现上述程序功能:
1.首先置操作数栈为空栈,表达式起始符#为运算符栈的栈底元素;
2.依次扫描表达式中每个字符,若是操作数则进OPND栈;若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕。
3.先做一个适合个位的+-*/运算,其次就要考虑到对n位和小数点的运算。
(2)程序主要模块
主要模块有:
头文件、栈定义及栈函数、运算符判断与优先级比较函数、实现计算函数
{InitStack(&S)
操作结果:
构造一个空栈S。
GetTop(S)
初始条件:
栈S已存在。
操作结果:
用P返回S的栈顶元素。
Push(&S,e)
初始条件:
栈S已存在。
操作结果:
插入元素ch为新的栈顶元素。
Pop(&S,e)
初始条件:
栈S已存在。
操作结果:
删除S的栈顶元素。
In(c)
操作结果:
判断字符是否是运算符,运算符即返回1。
Precede(c1,c2)
初始条件:
c1,c2为运算符。
操作结果:
判断运算符优先权,返回优先权高的。
Operate(a,op,b)
初始条件:
a,b为整数,op为运算符。
操作结果:
a与b进行运算,op为运算符,返回其值。
EvaluateExpression()
初始条件:
输入表达式合法。
操作结果:
返回表达式的最终结果。
}
1.栈定义及栈函数:
用结构体定义栈,并实现对栈的以下操作:
构造栈、取栈顶元素、入栈、出栈
2.运算符优先级比较,返回优先级高的:
算符间的优先关系如下:
+
-
*
/
(
)
#
+
>
<
<
<
<
>
>
-
>
>
<
<
<
>
>
*
>
>
>
>
<
>
>
/
>
>
>
>
<
>
>
(
<
<
<
<
<
=
)
>
>
>
>
>
>
#
<
<
<
<
<
=
表1
3.主要操作函数。
算法概要流程图:
各函数具体定义见附1程序清单。
3.实验总结
这次实验的目的主要是在表达式求值中应用栈这种线性数据结构。
DOS框实现实验操作虽然更加本质,但是却不利于与用户,尤其是非编程人员的交互,因此我设计了简单的人机交互对话框,显得更加人性化。
实验结果还有许多可以改进之处,例如使程序可以接受矩阵并作一些运算,对话框界面也有必要做进一步的功能添加。
4.附1:
程序清单
(实验结果与实验程序已分享到网址
#include
usingnamespacestd;
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintStatus;
typedefstruct
{
double*base;
double*top;
intstacksize;
}SqStack1;
typedefstruct
{
char*base;
char*top;
intstacksize;
}SqStack2;
StatusInitStack1(SqStack1&S)
{
S.base=(double*)malloc(STACK_INIT_SIZE*sizeof(double));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack1
StatusInitStack2(SqStack2&S)
{
S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack2
StatusGetTop1(SqStack1S,double&e)
{
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base)returnERROR;
e=*(S.top-1);//返回栈顶元素
returnOK;
}//GetTop1
charGetTop2(SqStack2S)
{
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base)
{
//cout<<"aaa";
returnERROR;}
chare=*(S.top-1);//返回栈顶元素
//cout< returne; }//GetTop2 StatusPush1(SqStack1&S,doublee) { //插入元素e为新的栈顶元素 //cout<<"xinshuis"< if(S.top-S.base>=S.stacksize)//栈满,追加存储空间 { S.base=(double*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float)); if(! S.base)returnERROR; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; }//if *S.top++=e; returnOK; }//Push1 StatusPush2(SqStack2&S,chare) { //插入元素e为新的栈顶元素 if(S.top-S.base>=S.stacksize)//栈满,追加存储空间 { S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char)); if(! S.base)returnERROR; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; }//if *S.top++=e; returnOK; }//Push2 StatusPop1(SqStack1&S,double&e) { //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top==S.base){//cout<<"aaaa"; returnERROR;} e=*--S.top; //cout<<"thisis"< returnOK; }//Pop1 StatusPop2(SqStack2&S,char&e) { //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top==S.base)returnERROR; e=*--S.top; returnOK; }//Pop2 StatusIn(charch)//判断字符是否是运算符,运算符即返回1 { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'); } charPrecede(charch1,charch2) { inti=0,j=0; staticchararray[49]={ '>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=','! ', '>','>','>','>','! ','>','>', '<','<','<','<','<','! ','='}; switch(ch1) { //i为下面array的横标 case'+': i=0;break; case'-': i=1;break; case'*': i=2;break; case'/': i=3;break; case'(': i=4;break; case')': i=5;break; case'#': i=6;break; } switch(ch2) { //j为下面array的纵标 case'+': j=0;break; case'-': j=1;break; case'*': j=2;break; case'/': j=3;break; case'(': j=4;break; case')': j=5;break; case'#': j=6;break; } return(array[7*i+j]);//返回运算符 } doubleOperate(doublea,chartheta,doubleb) { switch(theta) { case'+': return(a+b);break; case'-': return(a-b);break; case'*': return(a*b);break; case'/': return(a/b);break; default: cout<<"输入错误! ";returnERROR;break; } } StatusEvaluateExpression() { //算术表达式求值的算符优先算法。 设OPTR和OPND分别为运算符栈和运算数栈, //OP为运算符集合 SqStack1OPND; SqStack2OPTR; charc,x,theta,y,d; doublea=0,b=0,k=0,z=0; InitStack1(OPND); InitStack2(OPTR); Push2(OPTR,'#'); cout<<"请输入您要求解的表达式并以“#”结尾: "< y=GetTop2(OPTR); c=getchar();//printf("字符是%c\n",c); while(c! ='#'||GetTop2(OPTR)! ='#') { if(! In(c)) { doubled1=0,d2=1,e=0; d1=0; while(c>='0'&&c<='9') { c-='0'; d1=d1*10+c; e=d1; c=getchar(); }//while if(c=='.') { c=getchar(); while(c>='0'&&c<='9') { d2/=10; c-='0'; e+=d2*c; c=getchar(); }//while }//if Push1(OPND,e); } else { y=GetTop2(OPTR); d=Precede(y,c); switch(d){ case'<': //栈顶元素优先权低 Push2(OPTR,c); c=getchar(); break; case'=': //脱括号并接收下一字符 Pop2(OPTR,x); c=getchar(); break; case'>': //退栈并将运算结果入栈 Pop2(OPTR,theta); Pop1(OPND,b); Pop1(OPND,a); Push1(OPND,Operate(a,theta,b)); break; case'! ': cout<<"请输入正确的表达式: "< break; }//switch } }//while GetTop1(OPND,k); cout<<"表达式结果为: "< returnOK; }//EvaluateExpression intmain() { EvaluateExpression(); //system("pause"); return0; } 5.附2: 运行结果 分别对实验简介中的三个式子进行结果检验 (一)DOS框: (二)界面优化(MFC): 上机实验二 1.上机实验简介 1)实验目的 对用户指定的.htm文件,将文件中的所有TAG及TAG中所包含的内容全部去掉。 2)开发工具 C++语言,MicrosoftVisualC++6.0开发软件 3)测试数据 对简单的个人网页《qingtianzhe的个人主页》与下载的西安交通大学数学与统计学院首页(http: //202.117.3.94/sxtjxy/index.jsp).htm文件做测试,其中《qingtianzhe的个人主页》内容如下: doctypehtml> a{text-decoration: none;color: #FFF;font-size: 16px;font-family: "微软雅黑";position: relative;float: left;display: block;} .nav{background-color: #000;overflow: hidden;height: 50px;} a: hover{border-bottom: 5pxsolid#09F;font-size: 18px;font-family: "迷你简菱心";} .navbox{width: 610px;margin: auto;} .navboxa{margin: 15px20px;padding-bottom: 12px;}
2.算法说明
(1)概要说明:
为实现上述程序功能,我们利用栈的数据结构,首先新建一个字符型栈,依次读入目标.htm文件的字符,当遇到左标签符“<”时进栈,后面字符继续进栈,当遇到右标签符“>”时,后面的内容写入新文件new.htm中,循环这个过程,当原文件结束时,得到去除tag符的新文件new.htm。
(2)程序主要模块
主要模块有:
头文件、栈定义及栈函数、实现读取与写入非tag内容操作的主函数
{InitStack(&S)
操作结果:
构造一个空栈S。
Push(&S,e)
初始条件:
栈S已存在。
操作结果:
插入元素ch为新的栈顶元素。
}
1.栈定义及栈函数:
用结构体定义栈,并实现对栈的以下操作:
构造栈、入栈
2.实现读取与写入非tag内容操作的主函数:
这一步借助C++的文件流实现,定义两个文件流,人流与出流,入流读取.htm文件,做完入栈操作到了非tag内容时将字符写入new.htm文件中。
3.实验总结
上次实验是对栈的初次计算机程序实现,需要的栈操作也更多,而这次可以说是对栈操作的一次熟练。
需要注意的就是实验之前需要将需要读取的文件放在程序目录下以便读取,结果文件是同样目录下的new.htm,可以用记事本打开查看。
还有一点美中不足的就是,.htm文件通常在开头会包括很多设置性语句,如语句a{text-decoration:
none;color:
#FFF;font-size:
16px;font-family:
"微软雅黑";position:
relative;float:
left;display:
block;}用来设置字体,当前实现的程序没有考虑这种问题。
与实验一相同,程序的界面化、可交互也是没有完全实现的问题,问题在于edit控件无法显示.htm文件中的中文字符,会显示乱码,而这样做的好处在于可以不用管待读取文件的目录问题,可以在对话框中选择路径。
4.附1:
程序清单
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#include
#include
usingnamespacestd;
//结构体部分
typedefintStatus;
typedefstruct
{
char*base;
char*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&S)
{
S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack
StatusPush(SqStack&S,chare)
{
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
{
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!
S.base)returnERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}//if
*S.top++=e;
returnOK;
}//Push
intmain()
{
SqStacklabel;
InitStack(label);
charc;
ifstreamin;
in.open("index.htm");//待读取文件
if(!
in)
{
cout<<"cannotopenoldfile.";
return1;
}
ofstreamout;
out.open("new.htm");//去除tag文件
if(!
out)
{
cout<<"cannotopennewfile.";
return1;
}
in.get(c);
while(in){
while(c=='<'){
Push(label,c);
in.get(c);
while(c!
='>'){
Push(label,c);
in.get(c);
}
Push(label,c);
in.get(c);
}
if(in){
out.put(c);
}
in.get(c);
}
in.close();
out.close();
return0;
}
5.附2:
运行结果
分别对实验简介中的两个.htm文件做测试:
(一)qingtianzhe的个人主页
a{text-decoration:
none;color:
#FFF;font-size:
16px;font-family:
"微软雅黑";position:
relative;float:
left;display:
block;}
.nav{background-color:
#000;overflow:
hidden;height:
50px;}
a:
hover{border-bottom:
5pxsolid#09F;font-size:
18px;font-family:
"迷你简菱心";}
.navbox{width:
610px;margin:
auto;}
.navboxa{margin:
15px20px;padding-bottom:
12px;}
qingtianzhe的个人主页...
qingtianzhe的个人主页...
基本信息
作品
兴趣爱好
足迹
学习生活
我的非诚勿扰
如下图:
(二)学院主页:
由于文件较长,只给出部分截图:
去除tag前
去除tag后:
上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 上机 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)