这道题做了好久,看到没有C语言题解咱就写一下,欢迎优化指正OvO- - 本解法采用逆波兰表达式求解,前半段是将中缀表达式变换成后缀表达试(逆波兰表达式) 关于逆波兰表达式大家可以百度知乎一下,算法入门里面也有逆波兰表达式的题,感觉用逆波兰算长表达式是真滴好使- -。 代码如下,大家应该都可以看懂,要注意的是数组下标的值一定要仔细!!还有一点要注意的就是当逆波兰表达式中出现连续的减号时,除了第一个减号剩余减号都要转换成加号,下面也有对应代码注解。如当遇到1-2-3-4时,第一部分变换的表达式时1,2,3,4,-,-,-,但由于有连续减号所以我们需要加一步变换->逆波兰表达式:1,2,3,4,-,+,+, 但如果遇到1-(2-3)的情况由于有()减号没有形成连续的减号所以就可以直接进行运算啦->逆波兰表达式:1,2,3,-,-。
int solve(char* s ) {
int topIdx=0;
char operator[100]={0};
char temp[100][10]={0};
int m=0,j=0;
//******************逆波兰转换,将中缀表达式转换成后缀表达式***********
int len=strlen(s);
for(int i=0;i<len;i++){
if(s[i]=='*'||s[i]=='('){
operator[topIdx++]=s[i];
}
else if(s[i]=='+'||s[i]=='-'){
if(operator[topIdx-1]=='*'){
while(operator[--topIdx]!='('&&topIdx>=0)
temp[j++][0]=operator[topIdx];
operator[++topIdx]=s[i];
topIdx++;
}
else
operator[topIdx++]=s[i];
}
else if(s[i]==')'){
while(operator[--topIdx]!='('&&topIdx>=0)
temp[j++][0]=operator[topIdx];
}
else{
temp[j][m++]=s[i];
if((s[i+1]<'0'||s[i+1]>'9')&&i<len-1){
j++;
m=0;
}
else if(i==len-1)
j++;
}
}
for(int i=0,j=1;i<topIdx;i++){
if(operator[i]=='-')
while(operator[i+j]=='-'&&(i+j)<topIdx)
operator[i+j++]='+';
}
int lenoftemp=0;
if(topIdx!=0){
for(int i=topIdx-1;i>=0;i--)
temp[j++][0]=operator[i];
lenoftemp=j;
}
//**************用逆波兰表达式求解最终结果***********
int result=0;
int integer[100];
// int *integer=(int *)malloc(sizeof(int)*lenoftemp);
for(int i=0,topIdx=0;i<lenoftemp;i++){
if(strcmp(temp[i],"+")==0){
result=integer[topIdx-2]+integer[topIdx-1];
topIdx--;
integer[topIdx-1]=result;
}
else if(strcmp(temp[i],"*")==0){
result=integer[topIdx-2]*integer[topIdx-1];
topIdx--;
integer[topIdx-1]=result;
}
else if(strcmp(temp[i],"-")==0){
result=integer[topIdx-2]-integer[topIdx-1];
topIdx--;
integer[topIdx-1]=result;
}
else
integer[topIdx++]=atoi(temp[i]);
}
return integer[0];
}