您好,欢迎访问三七文档
#includestdio.h#includestdlib.h#includestring.h#includemath.h#defineMAXSIZE100#defineN1000inti=0;//表达式数typedefstructexpression//表达式结构{longdoubleresult;charexpstr[MAXSIZE];}expression;expressionexpr[N];//表达式的一个整体容器stypedefstruct//操作码栈定义{charcode[MAXSIZE];inttop;}opnd;typedefstruct//操作数栈定义{doubledate[MAXSIZE];inttop;}num;//《--opnd栈操作--》:voidinitstack(opnd*op)//初始化栈{op-top=-1;}intempty_opnd(opnd*op)//判空{if(op-top==-1)return0;elsereturn1;}intpush_opnd(opnd*op,charco)//压栈{if(op-top==MAXSIZE-1){printf(The\opnd\stackisfull.);return0;}op-top++;op-code[op-top]=co;return1;}charpop_opnd(opnd*op)//出栈{chara='\0';if(op-top==-1){printf(error:The\opnd\stackisempty.);returna;}a=op-code[op-top];op-top--;returna;}charget_opnd(opnd*op)//查看栈顶{chara='\0';if(op-top==-1){printf(error:The\opnd\stackisempty.);returna;}elsereturnop-code[op-top];}//《--num栈操作--》:voidinitstack(num*nu){nu-top=-1;}intempty_num(num*nu)//判空{if(nu-top==-1)return0;elsereturn1;}intpush_num(num*nu,doubleda)//压栈{if(nu-top==MAXSIZE-1){printf(error:The\date\stackisfull.);return0;}nu-top++;nu-date[nu-top]=da;return1;}doublepop_num(num*nu)//出栈{doublea='\0';if(nu-top==-1){printf(error:The\date\stackisempty.);returna;}a=nu-date[nu-top];nu-top--;returna;}doubleget_num(num*nu)//查看栈顶{if(nu-top!=-1)returnnu-date[nu-top];}//《--结束栈定义操作--》//《--函数操作--》:intchange_opnd(charcode)//将字符型操作码转换成优先级,非表达式字符反回-2{switch(code){case'=':return1;break;case')':return2;break;case'+':return3;break;case'-':return3;break;case'*':return4;break;case'/':return4;break;case'(':return0;break;//操作码级别=0;case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':case'0':case'.':return-1;//操作数级别=-1;default:return-2;//其它符号级别=-2}}charprocede(chartop,charcode)//处理操作码,判断栈的操作{if(change_opnd(code)==0)//(入栈return('');elseif(change_opnd(code)==2&&change_opnd(top)==0)//(和)同时出现,(出栈,)不入栈return('=');elseif(change_opnd(code)=change_opnd(top))//弹出两个数字和一个符号进行计算return('');elsereturn('');//入栈}doublechange_num(charstr[])//数字字符串转成double型数字{char*s=str;intp=1,q=0;//p=小数点前位数,q=小数点后位数chard[]=.,z[]=0;doubleda=0,p1;if(strstr(str,d)==0)//判断是否有小数点p=strlen(str);elseif(strstr(str,d)==str)//没有输入小数点前的数,如.032{p=1;q=strlen(str)-1;strcpy(str,strcat(z,str));}else{p=strstr(str,d)-str;q=strlen(str)-p-1;}for(inti=0;ip;i++)//小数点前的各位数乘以各自的阶数,然后叠加:123=1*100+2*10+3*1da=da+((int)str[i]-48)*pow(10,p-i-1);for(intj=0;jq;j++)//小数点后的各位数乘以各自的阶数,然后叠加:0.123=1*0.1+2*0.01+3*0.001da=da+((int)str[strlen(str)-1-j]-48)*pow(0.1,q-j);returnda;}intmake_str()//语法检查{char*p,*p1;intn=0;printf(\n请输入表达式,以“=”结尾:);gets(expr[i].expstr);p=expr[i].expstr;p1=p;while(1){if(*p=='\0')if(*(p-1)=='=')//语法检查结束break;else{//没有以=结尾printf(\n表达式以\=\结尾。请重新输入:);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}if(change_opnd(*p)==2)//一个),n-1n--;if(change_opnd(*p)==0)//一个(,n+1n++;if(*p1==*p)//第一个字符的判断,只能以数字或(开头,不能有非法字符if(change_opnd(*p)0){printf(\n表达式只能以“数字”或“(”开头。请重新输入:);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}elseif(change_opnd(*p)==-2){printf(\n表达式\%c\为非法字符。请重新输入:,*p);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}else{//合法刚跳到下一个字符p=p+1;continue;}if(change_opnd(*p)==-2)//非法字符判断{printf(\n表达式\%c\为非法字符。请重新输入:,*p);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}if(change_opnd(*p)==0)//(前一个字符只能是+、-、*、/、({if(change_opnd(*(p-1))3&&change_opnd(*(p-1))4)if(change_opnd(*(p-1))!=0){printf(\n表达式\%c\或\%c\不符合语法。请重新输入:,*(p-1),*p);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}}if(change_opnd(*p)0)//+、-、*、/、=、)前一个字符只能是数字和)if(change_opnd(*(p-1))!=-1)if(change_opnd(*(p-1))!=2){printf(\n表达式\%c\或\%c\不符合语法。请重新输入:,*(p-1),*p);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}if(change_opnd(*p)==1)//判断表达式中是否有=重复出现,最后括号是否配对{if(*(p+1)!='\0'){printf(\n表达式中\=\,只能出现在表达式结束处。请重新输入:);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}if(n!=0){printf(\n表达式括号不配。请重新输入:);gets(expr[i].expstr);p=expr[i].expstr;n=0;continue;}}p=p+1;}return1;}doublecaculate(opnd*op,num*nu)//简单计算+,-,*,/{doubleb=pop_num(nu),a=pop_num(nu);switch(pop_opnd(op)){case'+':return(a+b);break;case'-':return(a-b);break;case'*':return(a*b);break;case'/':return(a/b);break;}}voidresult(opnd*op,num*nu)//计算结果{charstr2[MAXSIZE]=,str3[2]=0;char*ps=expr[i].expstr;initstack(op);//初始化栈initstack(nu);push_opnd(op,'=');while(!((*ps=='=')&&(get_opnd(op)=='=')))//检查是表达式和操作码是否到尾if(change_opnd(*ps)==-1)//操作数处理{while(change_opnd(*ps)==-1){strncpy(str3,ps,1);//数字字符一个个取出放在str2strcat(str2,str3);ps++;}push_num(nu,change_num(str2));strcpy(str2,);}else//操作码处理{switch(procede(get_opnd(op),*ps)){case'':push_opnd(op,*ps);break;case'=':pop_opnd(op);break;case'':push_num(nu,caculate(op,nu));continue;break;}if(*ps==')'&&get_opnd(op)=='='){ps++;continue;}if(*ps=='='||get_opnd(op)=='=')continue;//表达式和操作码有一个到尾,则跳出继续循环ps++;}expr[i].result=get_num(nu);printf(\n\t表达式:%s\t计算结果:%lf\n,expr[i].expstr,expr[i].result);printf(\t----------------------------------------------------------------\n);i++;//表达式个数加1;}voidcheck()//显示计算结果{for(intn=0;ni;n++){printf(\n);printf(\t%d--------------------------------------
本文标题:数据结构源程序
链接地址:https://www.777doc.com/doc-3381651 .html