1、 数 理 学 院课程设计报告书课程名称 数据结构课程设计 设计题目 算术表达式求值演示 专业班级 学 号 姓 名 指导教师 2014 年 12 月1设计时间2014 年 12 月 232014 年 12 月 29 日2 设计目的设计一个程序,演示算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。3设计任务(1)设置运算符栈和运算数栈辅助分析算符优先关系;(2)在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应的运算;(3)在识别出运算数的同时,要将其字符序列形式转换成整数形式;(4)在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操
2、作的内容。4 设计内容 4.1需求分析4.1.1 该程序能实现算术四则运算表达式的求值,显示运算过程。4.1.2 输入的形式:表达式,例如 5*(3+7 )#。包含的运算符只能有+ 、 -、 *、 /、 ( ) ;4.1.3 输出的形式:运算结果,50。4.1.4 程序所能达到的功能:对表达式求值并输出。4.2总体设计4.2.1.栈的抽象数据类型定义:ADT Stack数据对象:D=ai|aiChar,i=1,2.,n,n0数据关系:R1=ai-1,ai|ai-1,ai D,i=2,3n约定 an 端为栈顶, ai 端为栈底4.2.2基本操作:InitStack( b=Pop2( a=Pop2
3、( Push2(break; 4.3.2 主函数和其他函数的伪码int main( ) printf(“请输入正确的表达式以#结尾:“); do gets(expr); while(!*expr); InitStack( /* 初始化运算符栈 */ Push( /* 将#压入运算符栈 */ InitStack2( /* 初始化操作数栈 */ printf(“表达式结果为:%dn“, EvalExpr();return 0; 4.3.3 函数的调用关系图调用关系图4.4 测试与分析4.4.1 测试mainEvaluateExpressionPush precedeIn PopReturnOpOr
4、dOperate 输出4.4.2实验分析:表达式求值程序是一个多次调用函数的过程,且调用的过程较为复杂,调试花费时间较多。在 while 循环时指针移动容易出错,因此多次出现内存错误,对于涉及的循环的操作开始和结束条件设置很关键。本次实验熟悉了栈数据结构的表示与实现方法。算法时间和空间分析:算法的运行时间主要花在 while 循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据) ,若后缀表达式由 n 个数据组成,则 此算法的时间复杂度为 O(n)。此算法在运行时所占用的临时空间主要取决于栈 S 的大小,显然,它的最大深度不会超过表达式中操作数的个数,因为操作数的个
5、数与运算符(假定把#也看作为一个特殊运算符,即结束运算符)的个数相等,所以此算法的空间复杂度也同样为 O(n)。4.5 附录源程序:#include #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 stacks
6、ize; int *base; int *top; Stack2;/* - 全局变量- */ Stack OPTR;/* 定义运算符栈*/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;retur
7、n OK; int InitStack2(Stack2 *s) /构造操作数栈 s-base=(int *)malloc(STACK_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-
8、top=ch; s-top+; return 0; int Push2(Stack2 *s,int ch)/操作数栈插入 ch 为新的栈顶元素 *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 的栈顶元素 cha
9、r p=*(s.top-1); return p; int GetTop2(Stack2 s) /用 p 返回操作数栈 s 的栈顶元素 int p=*(s.top-1); return p; /* 判断运算符优先权,返回优先权高的 */ char Precede(char c1,char c2) int i=0,j=0; static char array49=, , , , , , , , , , , , , , , , , , , , , , , , !, , , : theta=Pop( b=Pop2( a=Pop2( Push2(break; return GetTop2(OPND);
10、 int main( ) printf(“请输入正确的表达式以#结尾:“); do gets(expr); while(!*expr); InitStack( /* 初始化运算符栈 */ Push( /* 将#压入运算符栈 */ InitStack2( /* 初始化操作数栈 */ printf(“表达式结果为:%dn“, EvalExpr();return 0; 5 总结与展望这次课程设计让我更加了解大一学到的 C 和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到 C 语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用,特别算术表达式有了深刻的理解。参考文献1 数据结构(C 语言版) 严蔚敏 清华大学出版社 2 C 语言程序设计 丁峻岭 中国铁道出版社3 C 程序设计 谭浩强 清华大学出版社成绩评定成绩 教师签字