数据结构算术表达式求值实验报告_第1页
数据结构算术表达式求值实验报告_第2页
数据结构算术表达式求值实验报告_第3页
数据结构算术表达式求值实验报告_第4页
数据结构算术表达式求值实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、北京理工大学珠海学院北京理工大学珠海学院 数据结构数据结构课程设计报告课程设计报告 题目:题目:_算术表达式求值算术表达式求值_ 所在学院:所在学院: 专业班级:专业班级: 学生姓名:学生姓名: 指导教师:指导教师: 2010 年年 05 月月 26 日日 目录目录 1前前 言言1 2概要设计概要设计1 2.1 数据结构设计数据结构设计1 2.2 算法设计算法设计1 2.3 adt 描述描述2 2.4 功能模块分析功能模块分析2 3详细设计详细设计3 3.1 数据存储结构设计数据存储结构设计3 3.2 主要算法流程图(或算法伪代码)主要算法流程图(或算法伪代码)3 4软件测软件测试试6 5心得

2、体会心得体会8 参考文献参考文献8 附附 录录8 1前前 言言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级, 又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入) 。为简化,规 定操作数只能为正整数,操作符为+、-*、/,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完 成运算符和运算数的识别处理,以及相应运算。 2概要设计概要设计 2.1 数据结构设计

3、 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作 数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连 续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针 top 指示栈顶元素在顺序栈中的位置, base 为栈底指针,在顺序栈中,它始终指向栈底,即 top=base 可作为栈空的标记,每当插入新的 栈顶元素时,指针 top 增 1,删除栈顶元素时,指针 top 减 1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为 optr,用以寄存运算符,另一个称做 opnd,用以寄存操作数或运算结果。

4、1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进 opnd 栈,若是运算符则和 optr 栈的栈顶运算符比较优 先权后作相应的操作,直至整个表达式求值完毕(即 optr 栈的栈顶元素和当前读入的字符均为”#”) 。 2.3 adt 描述 adt stack 数据对象:d= |elemset,i=1,2,,n, n0 i a i a 数据对象:r1=|,i=2,,n 1 , ii aa 1i adai 约定端为栈顶,端为栈底。 n a i a 基本操作: initstack( char *base; char *top; stack; /*

5、定义整型栈 */ typedef struct int stacksize; int *base; int *top; stack2; 3.2 主要算法流程图(或算法伪代码) 1. precede(char c1,char c2) 判断运算符优先权,返回优先权高的。 算符间的优先关系如下: +-*/()# + - * / ( #, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , !, , , , , , , , !, =; /用一维数组存储 49 种情况 switch(c1) /* i 为下面 array 的横标 */

6、 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(c2) /* 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 #

7、 : j=6;break; return (array7*i+j); /* 返回运算符 array7*i+j为对应的 c1,c2 优先关系*/ 2. int evalexpr()主要操作函数。算法概要流程图: 利用该算法对算术表达式 3*(7-2)求值操作过程如下: 步骤optr 栈opnd 栈输入字符主要操作 1#3*(7-2)#push(opnd,3) 2#3*(7-2)#push(optr,*) 3#*3(7-2)#push(opnr,() 4#*(37-2)#push(opnd,7) 5#*(3 7-2)#push(opnr,-) 6#*(-3 72)#push(opnd,2) 7#*

8、(-3 7 2)#operate(7,-,2) 8#*(3 5)#pop(optr) 9#*3 5#operate(3,*,5) 10#15#return(gettop2(opnd) ) 表 2 算法伪代码如下: int evalexpr()/主要操作函数 c = *ptr+; while(c!=#|gettop(optr)!=#) if(!in(c) /不是运算符即进栈 if(!in(*(ptr-1) ptr=ptr-1; m=atoi(ptr);/取字符串前面的数字段 n=num(m); push2( ptr=ptr+n; c=*ptr+; else switch(precede(gett

9、op(optr),c) case :/退栈并将运算结果入栈 theta=pop( b=pop2( a=pop2( push2( break; 4软件测试软件测试 1.运行成功后界面。 2.输入正确的表达式后。 3.更改表达式,输入有 2 位数的整数调试。 5心得体会心得体会 这次课程设计让我更加了解大一学到的 c 和这个学期学到的数据结构。课设题目要 求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力 和更加了解编程思想和编程技巧。 这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨, 如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分

10、号,引号,或者数 据类型上。就像我在写 evalexpr()函数时,忘了指针的地址符值不用加*号,这一点小小 的错误也耽误了我几十分钟,所以说细节很重要。 程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收 获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固, 达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时 体会到 c 语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用, 特别算术表达式有了深刻的理解。 这个程序是我们 3 个人完成的,同时我认为我们的工作是一个团队的工作,团队需 要个人,个人也离不开

11、团队,必须发扬团结协作的精神。某个人的离群都可能导致导致 整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否 则一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的 保证。而这次课程设计也正好锻炼我们这一点,这也是非常宝贵的 最后,感谢老师在这次课程设计的悉心指导,祝老师身体健康,工作顺利。最后,感谢老师在这次课程设计的悉心指导,祝老师身体健康,工作顺利。 参考文献参考文献: 1.数据结构(c 语言版) 严蔚敏 清华大学出版社 2.c 语言程序设计 丁峻岭 中国铁道出版社 3.c 程序设计 谭浩强 清华大学出版社 附附 录录 程序源代码: #in

12、clude #include #include #define null 0 #define ok 1 #define error -1 #define stack_init_size 100 #define stackincrement 20 /* 定义字符类型栈 */ typedef struct int stacksize; char *base; char *top; stack; /* 定义整型栈 */ typedef struct int stacksize; int *base; int *top; stack2; /* - 全局变量- */ stack optr;/* 定义运算

13、符栈*/ stack2 opnd; /* 定义操作数栈 */ char expr255 = ; /* 存放表达式串 */ char *ptr = expr; int initstack(stack *s) /构造运算符栈 s-base=(char *)malloc(stack_init_size*sizeof(char); if(!s-base) return error; s-top=s-base; s-stacksize=stack_init_size; return ok; int initstack2(stack2 *s) /构造操作数栈 s-base=(int *)malloc(st

14、ack_init_size*sizeof(int); if(!s-base) return error; s-stacksize=stack_init_size; s-top=s-base; return ok; int in(char ch) /判断字符是否是运算符,运算符即返回 1 return(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=#); int push(stack *s,char ch) /运算符栈插入 ch 为新的栈顶元素 *s-top=ch; s-top+; return 0; int push2(stack2 *s,int ch)/操作数栈插入 ch

15、 为新的栈顶元素 *s-top=ch; s-top+; return 0; char pop(stack *s) /删除运算符栈 s 的栈顶元素,用 p 返回其值 char p; s-top-; p=*s-top; return p; int pop2(stack2 *s)/删除操作数栈 s 的栈顶元素,用 p 返回其值 int p; s-top-; p=*s-top; return p; char gettop(stack s)/用 p 返回运算符栈 s 的栈顶元素 char p=*(s.top-1); return p; int gettop2(stack2 s) /用 p 返回操作数栈

16、s 的栈顶元素 int p=*(s.top-1); return p; /* 判断运算符优先权,返回优先权高的 */ char precede(char c1,char c2) int i=0,j=0; static char array49= , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , !, , , , , , , , !, =; switch(c1) /* i 为下面 array 的横标 */ case + : i=0;break; case - : i=1;break; case * : i=2;brea

17、k; case / : i=3;break; case ( : i=4;break; case ) : i=5;break; case # : i=6;break; switch(c2) /* 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 (array7*i+j); /* 返回运算符 */ /*操作函数 */ i

18、nt operate(int a,char op,int b) switch(op) case + : return (a+b); case - : return (a-b); case * : return (a*b); case / : return (a/b); return 0; int num(int n)/返回操作数的长度 char p10; itoa(n,p,10);/把整型转换成字符串型 n=strlen(p); return n; int evalexpr()/主要操作函数 char c,theta,x; int n,m; int a,b; c = *ptr+; while(c!=#|gettop(optr)!=#) if(!in(c) if(!in(*(ptr-1) ptr=ptr-1; m=atoi(ptr);/取字符串前面的数字段 n=num(m); push2( ptr=ptr+n; c=*ptr+; else switch(precede(gettop(optr),c) case : theta=pop( b=pop2( a=pop2( push2( break; return gettop2(opnd); int main( ) printf(请输入正确的表达式以#结尾:); do gets(exp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论