资源描述:
《数据结构课程设计之算术表达式求值》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1【实验题目及要求】[问题描述] 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正实数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。[基本要求](1)从键盘或文件读入一个合法的算术表达式,输出正确的结果。(2)显示输入序列和栈的变化过程。(3)考虑算法的健壮性,当表达式错误时,要给出错误原因的提示。(4)实现非整数的处理(可选功能)。2【源代码(C语言)】#
2、include#include#include#defineMAXSIZE20#defineOK1#defineERROR0#defineOVERLOW0#defineYES1#defineNO0typedefstruct{char*base;char*top;intstacksize;//最大存储量}OPTR;//字符存储栈typedefstruct{float*base;float*top;intstacksize;//最大存储量}OPND;//数值存储栈intInitOptrStack(OPTR*);//字符栈初始
3、化函数intOptrPush(OPTR*,char);//进字符栈操作intOptrPop(OPTR*,char*);//出字符栈操作intOptrEmpty(OPTR);//判断字符栈是否为空charGetOptrTop(OPTR);//返回字符栈顶元素intInitOpndStack(OPND*);//数值栈初始化函数intOpndPush(OPND*,float);//进数值栈操作intOpndPop(OPND*,float*);//出数值栈操作intOpndEmpty(OPND);//判断数值栈是否为空intJudgeChar(char);//判断是否为字符floatG
4、etFloat(char*);//接收一个数字charPrecede(char,char);//判断优先级操作floatCaculate(float,float,char);//计算数值voidmain(){charch,noMean,ci;floatnum,number1,number2;OPTRoptr;OPNDopnd;//system("color30");InitOptrStack(&optr);InitOpndStack(&opnd);while(1){printf("请输入表达式以“#”开始,以“#”结束");do{ch=getchar();}while(ch
5、!='#');//忽略前面非‘#’字符OptrPush(&optr,ch);ch=getchar();while(ch!='#'
6、
7、GetOptrTop(optr)!='#'){if(!JudgeChar(ch)){//如果输入的是数字num=GetFloat(&ch);OpndPush(&opnd,num);}else{//输入的是字符switch(Precede(GetOptrTop(optr),ch)){case'<':OptrPush(&optr,ch);//栈顶优先级低ch=getchar();break;case'=':OptrPop(&optr,&noMean);
8、//左右括号,把左括号出栈ch=getchar();break;case'>'://栈顶优先级高if(OpndPop(&opnd,&number2)&&OpndPop(&opnd,&number1)){OptrPop(&optr,&ci);num=Caculate(number1,number2,ci);//出栈计算OpndPush(&opnd,num);}else{printf("输入过多运算符!");system("PAUSE");exit(0);}break;}//witch}//else}if(opnd.top-opnd.base>=2){printf("俩个括号之
9、间缺少运算符!");system("PAUSE");exit(0);}OpndPop(&opnd,&num);//直接把OPND的栈元素赋值给numprintf("运算结果为%.3f",num);}system("PAUSE");}intInitOptrStack(OPTR*OP){OP->base=(char*)malloc((MAXSIZE+1)*sizeof(char));OP->top=OP->base;OP->stacksize=MAXSIZE;returnOK;}intO