- 详细说明:将由数字和四则运算符组成的后缀表达式变换为中缀表达式。输入的后缀表达式包含的运算符不超过15个。要求转换后的中缀表达式中不应出现不必要的括号。例如,整个表达式两端的括号要省略,不影响原计算顺序的括号要省略。
- 后缀式转中缀式
- #include<stdio.h>
- #include<string.h>
- char str[50][1000],si[1000],t[1000];
- long gra[1000];
- int main(){
- long l,sn,i,j,k;
- gets(si);
- l=strlen(si);
- sn=0;
- i=0;j=0;
- while (j<l){
- while ((j<l)&&(si[j]!=' '))
- j++;
- if ((j==i+1)&&(si[i]=='+')){
- sn--;
- if (gra[sn-1]<0){
- strcpy(t,str[sn-1]);
- strcpy(str[sn-1],"(");
- strcat(str[sn-1],t);
- strcat(str[sn-1],")");
- }
- strcat(str[sn-1],"+");
- if ((gra[sn]==1)||(gra[sn]==2)||(gra[sn]<0)){
- strcpy(t,str[sn]);
- strcpy(str[sn],"(");
- strcat(str[sn],t);
- strcat(str[sn],")");
- }
- strcat(str[sn-1],str[sn]);
- gra[sn-1]=1;
- gra[sn]=0;
- }
- else if ((j==i+1)&&(si[i]=='-')){
- sn--;
- if (gra[sn-1]<0){
- strcpy(t,str[sn-1]);
- strcpy(str[sn-1],"(");
- strcat(str[sn-1],t);
- strcat(str[sn-1],")");
- }
- strcat(str[sn-1],"-");
- if ((gra[sn]==1)||(gra[sn]==2)||(gra[sn]<0)){
- strcpy(t,str[sn]);
- strcpy(str[sn],"(");
- strcat(str[sn],t);
- strcat(str[sn],")");
- }
- strcat(str[sn-1],str[sn]);
- gra[sn-1]=2;
- gra[sn]=0;
- }
- else if ((j==i+1)&&(si[i]=='*')){
- sn--;
- if ((gra[sn-1]==1)||(gra[sn-1]==2)||(gra[sn-1]<0)){
- strcpy(t,str[sn-1]);
- strcpy(str[sn-1],"(");
- strcat(str[sn-1],t);
- strcat(str[sn-1],")");
- }
- strcat(str[sn-1],"*");
- if (gra[sn]!=0){
- strcpy(t,str[sn]);
- strcpy(str[sn],"(");
- strcat(str[sn],t);
- strcat(str[sn],")");
- }
- strcat(str[sn-1],str[sn]);
- gra[sn-1]=3;
- gra[sn]=0;
- }
- else if ((j==i+1)&&(si[i]=='/')){
- sn--;
- if ((gra[sn-1]==1)||(gra[sn-1]==2)||(gra[sn-1]<0)){
- strcpy(t,str[sn-1]);
- strcpy(str[sn-1],"(");
- strcat(str[sn-1],t);
- strcat(str[sn-1],")");
- }
- strcat(str[sn-1],"/");
- if (gra[sn]!=0){
- strcpy(t,str[sn]);
- strcpy(str[sn],"(");
- strcat(str[sn],t);
- strcat(str[sn],")");
- }
- strcat(str[sn-1],str[sn]);
- gra[sn-1]=4;
- gra[sn]=0;
- }
- else{
- for (k=i;k<j;k++)
- str[sn][k-i]=si[k];
- str[sn][j-i]='\0';
- if (str[sn][0]=='-')
- gra[sn]=-1;
- else
- gra[sn]=0;
- sn++;
- }
- while ((j<l)&&(si[j]==' '))
- j++;
- i=j;j=i;
- }
- printf("%s\n",str[0]);
- scanf("%ld",&sn);
- return 0;
- }
后缀表达式变换为中缀表达式
最新推荐文章于 2024-07-26 13:01:05 发布