Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
Input
输入一算术表达式,以’#'字符作为结束标志。(数据保证无空格,只有一组输入)
Output
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
+ab-c/def
ab+c-d/ef
abcde/-f+
#include<stdio.h>
#include<string.h>
int findx(char ch)//后缀表达式中的优先级
{
if(ch=='(')
return 0;
else if(ch==')')
return 3;
else if(ch=='+'||ch=='-')
return 1;
else
return 2;
}
int findy(char ch)//前缀表达式中的优先级
{
if(ch=='(')
return 3;
else if(ch==')')
return 0;
else if(ch=='+'||ch=='-')
return 1;
else
return 2;
}
int main()
{
/*
数组str[]来储存最初的输入;
数组send[]来储存最后的输出;
数组s[]来充当栈,临时保存操作符;
*/
char s[10010];
char send[10010];
char str[10010];
int top=0,i,len,j;
scanf("%s",str);
len=strlen(str);
top=0;
j=0;
for(i=len-1; i>=0; i--)//前缀,从右向左扫描
{
if(str[i]=='#')
continue;
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
{
send[j++]=str[i];
}
else
{
if(top==0)
{
s[++top]=str[i];
}
else
{
if(str[i]==')')
{
s[++top]=')';
}
else if(findy(str[i])<findy(s[top]))
{
send[j++]=s[top];
s[top]=str[i];
}
else if(str[i]=='(')
{
while(s[top]!=')')
{
send[j++]=s[top];
top--;
}
top--;
}
else
{
s[++top]=str[i];
}
}
}
}
while(top!=0)
{
send[j++]=s[top];
top--;
}
for(i=j-1; i>=0; i--) //反着输出
{
printf("%c",send[i]);
}
printf("\n");
for(i=0; i<len; i++) //中缀
{
if(str[i]=='('||str[i]==')'||str[i]=='#')
continue;
else
printf("%c",str[i]);
}
printf("\n");
for(i=0; i<len; i++)//后缀,从左向右扫描
{
if(str[i]=='#')
break;
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
{
printf("%c",str[i]);
}
else
{
if(top==0)
{
s[++top]=str[i];
}
else
{
if(str[i]=='(')
{
s[++top]='(';
}
else if(findx(str[i])<=findx(s[top]))
{
printf("%c",s[top]);
s[top]=str[i];
}
else if(str[i]==')')
{
while(s[top]!='(')
{
printf("%c",s[top]);
top--;
}
top--;
}
else
{
s[++top]=str[i];
}
}
}
}
while(top!=0)
{
printf("%c",s[top]);
top--;
}
printf("\n");
getchar();
getchar();
return 0;
}