资源描述:
《2019算术表达式的求解-数据结构课程设计报告》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、算术表达式的求解-数据结构课程设计报告 课程设计报告 题目:算术表达式求值一、需求分析1、设计要求: 给定一个算术表达式,通过程序求出最后的结果1>、从键盘输入要求解的算术表达式;2>、采用栈结构进行算术表达式的求解过程;3>、能够判断算术表达式正确与否;4>、对于错误表达式给出提示; 5>、对于正确的表达式给出最后的结果;2、设计构想: 为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPN
2、D,操作符入OPTR。在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。二、概要设计 1、本程序包含的模块: 栈模块——实现栈抽象数据类型运算模块——实现数据表达式的运算主程序模块 算术运算式的求解栈模块主函数模块main运算模块定义栈结构初
3、始化栈出栈入栈取栈顶元素判断输入字符类型判断符号优先级基础运算函数运算函数三、详细设计栈模块 1、定义栈结构structSqstack { elemtype*top;//栈顶元素elemtype*base;//栈底元素intstacksize;//栈的大小}; 2、栈的基本操作①初始化栈 statusinitstack(structSqstack&s){ =(elemtype*)malloc(stack_size*sizeof(elemtype));if(!)returnOVERFLOW;=; =stack_size;return
4、OK;}②入栈 statuspush(structSqstack&s,elemtypee){ if(>=){ =(elemtype*)realloc(,(+stack_increase ment)*sizeof(elemtype)); if(!)returnOVERFLOW;=+;+=stack_increasement;} *++=e;returnOK;}③出栈 elemtypepop(structSqstack&s){ elemtypee;if(==)returnERROR;e=*--; returne;} ④取栈顶元素
5、 elemtypegettop(structSqstack&s){ elemtypee;if(==)returnERROR;e=*;returne;} 运算模块 1、判断输入字符c是否为操作符:若是,则返回1;否则,返回0intIn(intc) { charp[10]=inti=0; while(p[i]!='\0'){ if(p[i]==c) return1; i++; }return0;} 2、判断运算符的优先级 charprecede(chartop,charc) //该函数为判断当前运算符与前一个运算符的
6、优先级,前一个运算符高于或等于当前运算符的优先级则返回‘>’,前一个运算符小于当前运算符的优先级则返‘';break; case'+': case'-': if(top=='#'
7、
8、top=='(') result='';break; case'*': case'/': if(top=='*'
9、
10、top=='/'
11、
12、top=='^') result='>'; else result=''; else result='';break; case'(':result='':theta=pop(optr);b=pop(opn
13、d);a=pop(opnd);push(opnd,operate(a,theta,b));break; //若当前操作符的优先级低于操作符栈的栈顶元素,则将操作符栈栈顶元素出栈,并将操作数栈的栈顶两个元素出栈,计算两个元素间以操作符栈栈顶元素为运算符的数学运算 }//switch}//if }//while returnpop(opnd);} 主程序模块 1、main函数 voidmain(intargc,char*argv){ structSqstackopnd;//操作数栈structSqstackoptr;//操作符栈in
14、itstack(opdn);initstack(optr); elemtyperesult; printf(printf(算术运算式的求解