利用栈求表达式的值课程设计最后老师改- 副本 联系客服

发布时间 : 星期日 文章利用栈求表达式的值课程设计最后老师改- 副本更新完毕开始阅读

case '=':return 1;break; case ')':return 2;break; case '+':return 3;break; case '-':return 3;break; case '*':return 4;break; case '/':return 4;break; case '(':return 0;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 } }

char procede(char top,char code)//处理操作码,判断栈的操作 { if(change_opnd(code)==0)//\入栈 return ('<'); else if(change_opnd(code)==2 && change_opnd(top)==0)//\和\同时出现,\出栈,\不入栈

return ('='); else if(change_opnd(code)<=change_opnd(top))//弹出两个数字和一个符号进行计算

return ('>'); else return ('<');//入栈 }

double change_num(char str[])//数字字符串转成double型数字 { char *s=str; int i,j; int p=1,q=0;//p=小数点前位数,q=小数点后位数

33

char d[]=\ double da=0; if(strstr(str,d)==0)//判断是否有小数点 p=strlen(str); else if(strstr(str,d)==str)//没有输入小数点前的数,如\ { p=1; q=strlen(str)-1; strcpy(str,strcat(z,str)); } else { p=strstr(str,d)-str; q=strlen(str)-p-1; } for(i=0;i

da=da+((int)str[i]-48)*pow(10,p-i-1); for(j=0;j

da=da+((int)str[strlen(str)-1-j]-48)*pow(0.1,q-j); return da; }

int check()//语法检查 { char *p,*p1; int n=0; printf(\请输入表达式,以=结尾:\ gets(EXPRESS[i].express); p=EXPRESS[i].express; p1=p; while(1) { if(*p=='\\0') if(*(p-1)=='=')//语法检查结束 break; else {//没有以\结尾 printf(\表达式以\\\结尾.请重新输入:\ gets(EXPRESS[i].express); p=EXPRESS[i].express;

34

n=0; continue; }

if(change_opnd(*p)==2)//一个\,n-1 n--;

if(change_opnd(*p)==0)//一个\,n+1 n++;

if(*p1==*p)//第一个字符的判断,只能以\数字\或\开头,不能有非法字符 if(change_opnd(*p)>0||*p=='.') if(change_opnd(*p)!=3)

{ printf(\表达式只能以数字或'('开头,请重新输入:\ gets(EXPRESS[i].express); p=EXPRESS[i].express; n=0; continue; } else if(change_opnd(*p)==-2) { printf(\表达式\\\为非法字符.请重新输入:\ gets(EXPRESS[i].express); p=EXPRESS[i].express; n=0; continue; } else { //合法刚跳到下一个字符 p=p+1; continue; }

if(change_opnd(*p)==0)//\前一个字符只能是\、-、*、/、(\{ if(change_opnd(*(p-1))<3&&change_opnd(*(p-1))!=-2) if(change_opnd(*(p-1))!=0) {

35

printf(\表达式'%c'不符合语法.请重新输入:\ gets(EXPRESS[i].express); p=EXPRESS[i].express; n=0; continue; } } if(change_opnd(*p)==2) // \后面只能是+ - * / = { if(change_opnd( *(p+1) )==0) { printf(\表达式\\\或\\\不符合语法.请重新输入:\

gets(EXPRESS[i].express); p=EXPRESS[i].express; n=0; continue; } } if(change_opnd(*p)==-1)//\、-、*、/、=、)\前一个字符只能是数字和\ if(change_opnd(*(p-1))==2) { printf(\表达式\\\或\\\不符合语法,请重新输入:\

gets(EXPRESS[i].express); p=EXPRESS[i].express; n=0; continue; } if(change_opnd(*p)==4) if(change_opnd(*(p-1))!=-1) if(change_opnd(*(p-1))!=2) { printf(\表达式'%c'或\\\不符合语法,请重新输入:\

gets(EXPRESS[i].express); p=EXPRESS[i].express; n=0; continue;

36