数据结构算术表达式求值3.docx

上传人:b****5 文档编号:6435767 上传时间:2023-01-06 格式:DOCX 页数:13 大小:67.62KB
下载 相关 举报
数据结构算术表达式求值3.docx_第1页
第1页 / 共13页
数据结构算术表达式求值3.docx_第2页
第2页 / 共13页
数据结构算术表达式求值3.docx_第3页
第3页 / 共13页
数据结构算术表达式求值3.docx_第4页
第4页 / 共13页
数据结构算术表达式求值3.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构算术表达式求值3.docx

《数据结构算术表达式求值3.docx》由会员分享,可在线阅读,更多相关《数据结构算术表达式求值3.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构算术表达式求值3.docx

数据结构算术表达式求值3

 

软件学院

课程设计报告书

 

课程名称数据结构

设计题目算术表达式求值

专业班级

学号

姓名

指导教师刘金亮

 

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]

 

成绩评定

成绩教师签字

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1