计算表达式 括号的嵌套问题
程序代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<ctype.h> int sum[20][3]; int search(int i); int left(int k); int chuli(int a,int b,char ch[]); int main() { char ch[100]; int i,t,k,j,u=0; gets(ch); t=strlen(ch); j=0; for(i=0;i<t;i++) { if(ch[i]=='(') //记录所有括号的对数 u++; } while(u--) { for(i=0;i<t;i++) { k=i; if(ch[i]=='l') continue; if(ch[i]=='('&&k<t) { k=i+1; while(ch[k]!='('&&k<t) { k++; if(ch[k]==')') { sum[j][0]=i;sum[j][1]=k;ch[i]='l';ch[k]='r';j++;break; //将括号所在位子记下 } } if(ch[k]=='r') break; } } } for(i=0;i<j;i++) { sum[i][2]=chuli(sum[i][0],sum[i][1],ch); //计算每一对括号里的值 } printf("%d",sum[j-1][2]); return 0; } int chuli(int a,int b,char ch[]) //该函数用来计算 { int i,p[10],k,l,num[10],m=0,end; char c; for(i=a;i<b;i++) { if(ch[i]=='r'||ch[i]=='b') continue; if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*') //记录括号里的符号 { c=ch[i];ch[i]='b'; } if(isdigit(ch[i])) { k=i;l=0;num[m]=0; while(isdigit(ch[k])||ch[k]=='l') { if(ch[k]=='l') //如果是括号里嵌套括号,将里面的值找出来 { num[m]=search(k); k=left(k); //跳过嵌套的括号 m++;k++;continue; } if(ch[i]=='r'||ch[i]=='b') continue; p[l]=ch[k]-'0';ch[k]='b';k++;l++; //将一连串数字的字符(即一个数的各个位上的数字)转化成整型赋给数组p } i=k; for(k=0;k<l;k++) { num[m]=num[m]+p[k]*pow(10,l-k-1);m++; //将数组p中的数字转化成真正的数,赋给数组num } } if(ch[i]=='-'&&isdigit(ch[i])) //考虑负数 { ch[i]='b';k=i+1;l=0;num[m]=0; while(isdigit(ch[k])||ch[k]=='l') { if(ch[k]=='l') { num[m]=search(k); k=left(k); m++;k++;continue; } if(ch[i]=='r'||ch[i]=='b') continue; p[l]=ch[k]-'0';ch[k]='b';k++;l++; } i=k; for(k=0;k<l;k++) { num[m]=num[m]+p[k]*pow(10,l-k-1);m++; } num[m]=-num[m]; } } if(c=='+') //开始计算括号里的数 { end=0; for(i=0;i<m;i++) { end=end+num[i]; } } if(c=='-') { end=num[0]; for(i=1;i<m;i++) { end=end-num[i]; } } if(c=='*') { end=1; for(i=0;i<m;i++) { end=end*num[i]; } } return end; } int search(int i) //找寻嵌套括号所表示的值 { int c,end; for(c=0;;c++) { if(i==sum[c][0]) { end=sum[c][2];break; } } return end; } int left(int k) //找寻嵌套括号,')'所在的位子 { int i,end; for(i=0;;i++) { if(k==sum[i][0]) { end=sum[i][1];break; } } return end; }
(+ 2 3 4 5)
表示2+3+4+5,其值为14
(* 2 3 5)
表示2*3*5,其值为30
减法可以表示为:
(- 2 3 4)
表示:2-3-4=-5
即括弧中第一个符号为运算符,后面是操作数,改运算也可以嵌套,比如
(* (+ 2 3) 6)
表示先计算2+3=5,然后再5*6=30
要求:给出一个这样的例子,然后计算其值。
写的不好看,拜托各位大侠看看,如果只有一个括号是没有问题的,但是一旦括号里面套了个括号,就出现问题了