计算表达式 括号的嵌套问题
程序代码:#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
要求:给出一个这样的例子,然后计算其值。
写的不好看,拜托各位大侠看看,如果只有一个括号是没有问题的,但是一旦括号里面套了个括号,就出现问题了







