数据结构 算术表达式求值.docx
- 文档编号:9694632
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:15
- 大小:67.58KB
数据结构 算术表达式求值.docx
《数据结构 算术表达式求值.docx》由会员分享,可在线阅读,更多相关《数据结构 算术表达式求值.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构算术表达式求值
软件学院
课程设计报告书
课程名称数据结构
设计题目算术表达式求值
专业班级
学号
姓名
指导教师刘金亮
2010年12月
1设计时间2
2设计目的2
3设计任务2
4设计内容3
4.1需求分析3
4.1.1程序的功能3
4.1.2基本要求:
3
4.1.3测试数据:
3
4.2总体设计3
4.2.1程序用到的抽象数据类型3
4.2.2主程序流程图:
4
4.2.3说明各模块之间的调用关系:
4
4.3详细设计4
4.3.1程序中用到的抽象数据类型:
4
4.4测试与分析6
4.4.1测试6
4.4.2调试分析8
4.5附录8
5总结与展望12
1设计时间
2010年12月27至2010年12月30
2设计目的
加强我们的实践能力,掌握数据结构的应用,算法的编写,类C语言的算法转换成C程序并上级调试的基本方法。
对我们基本的程序设计素养的培养和软件工作者作风的训练,起到显著的促进作用。
3设计任务
设计一个程序,演示用算符优先法对算术表达式求值的过程。
4设计内容
4.1需求分析
4.1.1程序的功能
(1)完成运算符和运算数的识别处理。
(2)在识别出运算数的同时,将字符序列形式转换成整数形式。
(3)实现对算数四则混和运算表达式的求值。
4.1.2基本要求:
1、在本次演示中,要输入以字符序列的形式,语法正确且不含变量的整数表达式然后咦“#”结束。
2、由于算符有优先关系,故用栈来实现。
设置运算符栈接收运算符,优先权低的压入栈内,优先权高的进行运算,设置运算数栈,来接收运算数,并存储运行的结果。
3、在读入字符序列的同时,完成运算符合运算数(整数)的识别处理,以及相应的运算,在识别出是运算数的同时,将当前字符序列转换成整数形式。
4.1.3测试数据:
1)8+2-3
2)3*(7-2)
3)8/(4-2)
4.2总体设计
4.2.1程序用到的抽象数据类型
本程序利用栈的概念,利用栈“先进后出”的原则,利用链表的存储结构,进而设计的。
4.2.2主程序流程图:
(1)首先定义一个栈,将字符x入栈定义栈结点,之后x出栈,既得到栈顶元素初始化的一个栈;
(2)对输入的字符判断是否为运算符,并比较其优先级;
(3)在读入字符序列的同时,完成运算符合运算数(整数)的识别处理。
在读入字符序列的同时,完成运算符合运算数(整数)的识别处理在读入字符序列的同时,完成运算符合运算数(整数)的识别处理。
4.2.3说明各模块之间的调用关系:
本算法一共进行了两次调用,第一次调用是charEval_Exp()对voidPushOptr(SNode*top,charx)和charPopOptr(SNode*top)的调用,第二次是主函数对charEval_Exp()的调用,完成了运算符的操作,完成字符串对整形的转换。
4.3详细设计
4.3.1程序中用到的抽象数据类型:
栈
#include
#include
#defineNULL0
typedefstructnode{//栈结点
chardate;
structnode*next;
}SNode;
SNode*InitStack(){//初始化top
SNode*top;
top=(SNode*)malloc(sizeof(SNode));
top->next=NULL;
returntop;
}
4.3.2对主程序和其它主要函数写出伪码算法:
charEval_Exp(){//完成运算符操作
chara,b,c,r,f,z;
intresult;
SNode*top[2];
top[0]=InitStack();
PushOptr(top[0],'#');
top[1]=InitStack();
c=getchar();
while(c!
='#'||(GetTop(top[0]))!
='#'){
if(!
In(c)){
PushOptr(top[1],c);
c=getchar();
}
else{
r=Precede(GetTop(top[0]),c);
switch(r){
case'<':
PushOptr(top[0],c);
c=getchar();
break;
case'=':
PopOptr(top[0]);
c=getchar();
break;
case'>':
b=PopOptr(top[0]);
a=PopOptr(top[1]);
z=PopOptr(top[1]);
result=Operate(z,b,a);
f=result+'0';//用+'0'完成字符串对整形的转换
PushOptr(top[1],f);
break;
}
}
}
returnf;
}
4.3.3画出函数的调用关系图
各程序模块之间的层次(调用)关系:
算符间优先关系如下表:
+
-
*
/
(
)
#
+
>
>
>
<
<
>
>
-
>
>
>
<
<
>
>
*
>
>
>
>
<
>
>
/
>
>
>
>
<
>
>
(
<
<
<
<
<
=
)
>
>
>
>
>
>
#
<
<
<
<
<
=
4.4测试与分析
4.4.1测试
给出测试数据,输出测试的结果,测试数据应该完整(覆盖算法各种情况)。
1)测试8+2-3结果如图4-1所示:
图4-1
2)测试3*(7-2)结果如图4-2所示:
图4-2
3)测试8/(4-2)的结果如图4-3所示:
图4-3
4.4.2调试分析
在设计程序的过程中,出现程序不能运行,发现不能找到表达式结束的标识符,因此,在设计的时候需要认为动态的添加结束标识符‘#’,是程序能够顺利的运行。
4.5附录
#include
#include
#defineNULL0
typedefstructnode{
chardate;
structnode*next;
}SNode;
SNode*InitStack(){
SNode*top;//初始化2个top,后面用来保存我们的输入
top=(SNode*)malloc(sizeof(SNode));
top->next=NULL;
returntop;
}
voidPushOptr(SNode*top,charx){
SNode*p;
p=(SNode*)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
charPopOptr(SNode*top){
SNode*p;
charx;
if(top==NULL)
returnNULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
returnx;
}
voidPushOpnd(SNode*top,charx){
SNode*p;
p=(SNode*)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
charPopOpnd(SNode*top){
SNode*p;
charx;
if(top==NULL)
returnNULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
returnx;
}
charGetTop(SNode*top){
return(top->next)->date;
}
intIn(charc){
intn;
switch(c){
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':
n=1;break;
default:
n=0;break;
}
returnn;
}
charPrecede(charx,chary){//判断符号的优先级
inti,j;
intform[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(x){
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(y){
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;
}
if(form[i][j]==1)
return'>';
else
if(form[i][j]==-1)
return'<';
else
return'=';
}
intOperate(charx,charz,chary){//进行二元运算acb(c为运算符),并返回运算结果
inta=x-'0',b=y-'0';
switch(z){
case'+':
returna+b;
case'-':
returna-b;
case'*':
returna*b;
case'/':
returna/b;
}
}
charEval_Exp(){
chara,b,c,r,f,z;
intresult;
SNode*top[2];
top[0]=InitStack();//调用上面定义的初始化方法
PushOptr(top[0],'#');//第一个放一个#用来表示并保存第一个输入
top[1]=InitStack();//进行初始化
c=getchar();//取得你控制台的输入
while(c!
='#'||(GetTop(top[0]))!
='#'){
if(!
In(c)){//如果一直不是#,
PushOpnd(top[1],c);//放到第二个top中
c=getchar();//继续取控制台
}
else{{//如果是#
r=Precede(GetTop(top[0]),c);
switch(r){
case'<':
PushOptr(top[0],c);//比较优先级
c=getchar();
break;
case'=':
PopOptr(top[0]);
c=getchar();
break;
case'>':
b=PopOptr(top[0]);
a=PopOpnd(top[1]);
z=PopOpnd(top[1]);
result=Operate(z,b,a);
f=result+'0';
PushOpnd(top[1],f);
break;
}
}
}
returnf;
}
voidmain(){
charresult;
result=Eval_Exp();
printf("%d\n",result-'0');
}
5总结与展望
通过这一个学期对数据结构的学习,让我认识到,数据结构就是众多编程语言里的核心,也为我们日后的学习打下基础
在整个上机实践的过程中,我注意到,无论程序的大小,我们都要以一颗认真的心去对待。
一旦程序中出现错误,会导致程序运行的失败。
因此,在设计程序的过程中,我们所要考虑的内容就不仅仅是仔细,还要做到全面。
在以前的C语言学习过程中,我们只需注意如何编写函数,如何顺利的完成我们所要达到的目的,这似乎是没有什么战术而言。
然而现在,情况改变了,在我们编写程序之前,还要综合考虑各种因素。
如:
选择我们自己所需要的数据结构,是用树,图,还是栈,串等,然后选定一种或几种存储结构来确定后面函数的主要风格。
最后在编写每一个函数之前,我们应该仔细的比对,挑选最适合当前状况的算法。
只有真正理解定义数据类型的好处,才能用这样这样一种数据结构来完成我们的程序,达到我们的目的。
通过这次课程设计我觉得我们学习《数据结构》的方法存在一定的弊端,《数据结构》的效果直接影响到我们对其它专业课的学习和今后业务的成长。
我觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要让我们勤动手,多实践。
参考文献
[1]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2007.
[2]谭浩强.C语言程序设计[M].北京:
清华大学出版社,2005.
[3]
成绩评定
成绩教师签字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算术表达式求值 算术 表达式 求值