数据结构上机实验报告.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;}
qingtianzhe的个人主页...
基本信息
作品
兴趣爱好
足迹
学习生活
我的非诚勿扰