思路是用递归~~ 比如1+3+4*7+3 先计算1+3 4+4*7+3 再 4+28+3 再 32+3 再35 ~~具体见代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void compute(double *dig,char *sign,int s1,int s2)
{
double temp1,temp2;
if(sign[s2]=='*')
{
s1++;
dig[s1]=dig[s1]*dig[s1-1];
s2++;
if(sign[s2]!='\0')
compute(dig,sign,s1,s2);
}
else if(sign[s2]=='/')
{
s1++;
dig[s1]=dig[s1-1]/dig[s1];
s2++;
if(sign[s2]!='\0')
compute(dig,sign,s1,s2);
}
else if(sign[s2]=='+')
{
if(sign[s2+1]=='+'||sign[s2+1]=='-')
{
s1++;
dig[s1]=dig[s1]+dig[s1-1];
s2++;
if(sign[s2]!='\0')
compute(dig,sign,s1,s2);
}
else
{
int i;
temp1=dig[s1];
temp2=dig[s1+1];
int k=s1+2; //存计算的;
for(i=s2+1;sign[i]!='\0'&&(sign[i]=='*'||sign[i]=='/');i++)
{
if(sign[i]=='*')
temp2=temp2*dig[k++];
else
temp2=temp2/dig[k++];
}
dig[k-1]=temp2+temp1;
if(sign[i]!='\0')
compute(dig,sign,k-1,i);
}
}
else if(sign[s2]=='-')
{
if(sign[s2+1]=='+'||sign[s2+1]=='-')
{
s1++;
dig[s1]=dig[s1-1]-dig[s1];
s2++;
if(sign[s2]!='\0')
compute(dig,sign,s1,s2);
}
else
{
int i;
temp1=dig[s1];
temp2=dig[s1+1];
int k=s1+2; //存计算的;
for(i=s2+1;sign[i]!='\0'&&(sign[i]=='*'||sign[i]=='/');i++)
{
if(sign[i]=='*')
temp2=temp2*dig[k++];
else
temp2=temp2/dig[k++];
}
dig[k-1]=temp1-temp2;
if(sign[i]!='\0')
compute(dig,sign,k-1,i);
}
}
}
int main()
{
char st[250]; //储存字符串;
double dig[250]; //储存数字;
char sign[250]; //储存符号;
int i,j,k,l; // l储存字符串长度,J记dig k记sign;
while(gets(st))
{
if(st[0]=='0'&&st[1]=='\0')
break;
memset(dig,0,sizeof(dig));
i=j=k=0;
l=strlen(st);
for(i=0;i<l;i++)
{
while(st[i]>='0'&&st[i]<='9')
{
dig[j]=dig[j]*10+st[i]-'0';
i++;
}
if(st[i]==' ')
continue;
j++;
if(st[i]=='+'||st[i]=='-'||st[i]=='*'||st[i]=='/')
sign[k++]=st[i];
}
sign[k]='\0'; //便于符号运算;
compute(dig,sign,0,0);
printf("%.2f\n",dig[j-1]);
}
return 0;
}
貌似还有一种思路,用树的遍历做 好像~~改天看看