后缀表达式变换为中缀表达式
2013-04-06 08:59
246 查看
详细说明:将由数字和四则运算符组成的后缀表达式变换为中缀表达式。输入的后缀表达式包含的运算符不超过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;
}
后缀式转中缀式
#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;
}
相关文章推荐
- C++实现中缀表达式转后缀表达式并求值
- 将中缀表达式转化为后缀表达式
- 自己编的中缀表达式转后缀表达式(C语言),供参考,指证
- 中缀表达式转后缀表达式
- 计算器:中缀表达式转后缀表达式
- 前缀表达式、中缀表达式、后缀表达式及转换实现
- 将中缀表达式转化成后缀表达式(逆波兰式)
- 中缀表达式到前缀表达式和后缀表达式
- 中缀表达式转后缀表达式
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
- 中缀表达式转后缀表达式
- 中缀表达式转换为后缀表达式的算法
- 中缀表达式转换成后缀表达式
- c++通过栈将中缀表达式转成后缀表达式
- 表达式计算(中缀表达式转后缀前缀表达式)
- 中缀表达式转后缀,以及后缀表达式的求值
- 栈的应用(一)——中缀表达式转后缀表达式
- C/C++ 已知中缀表达式,求后缀表达式及值
- 简单计算器实现-中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式