算术表达式的转换
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
Input
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
Output
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a,b,c,d=0;
char i[10000],j[10000],k[10000];
scanf("%s",i);
c=strlen(i);
c-=2;
b=0;
for(a=c;a>=0;a--)
{
if(i[a]>='a'&&i[a]<='z')
{
k[d]=i[a];
d++;
}
else
{
if((i[a]=='+'||i[a]=='-'||i[a]=='*'||i[a]=='/')&&b==0)
{
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='*'||j[b-1]=='/')&&(i[a]=='+'||i[a]=='-'))
{
b--;
k[d]=j[b];
d++;
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='+'||j[b-1]=='-')&&(i[a]=='*'||i[a]=='/'))
{
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='-'||j[b-1]=='+')&&(i[a]=='+'||i[a]=='-'))
{
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='*'||j[b-1]=='/')&&(i[a]=='*'||i[a]=='/'))
{
j[b]=i[a];
b++;
}
else if(b>0&&j[b-1]==')'&&(i[a]=='+'||i[a]=='-'||i[a]=='*'||i[a]=='/'))
{
j[b]=i[a];
b++;
}
if(i[a]==')')
{
j[b]=')';
b++;
}
else if(i[a]=='(')
{
b--;
while(j[b]!=')')
{
k[d]=j[b];
d++;
b--;
}
}
}
if(a==0)
{
b--;
while(b>=0)
{
k[d]=j[b];
d++;
b--;
}
}
}//前缀。
for(a=d-1;a>=0;a--)
{
printf("%c",k[a]);
}
printf("\n");//中缀
for(a=0;i[a]!='#';a++)
{
if(i[a]!='('&&i[a]!=')')
printf("%c",i[a]);
}
printf("\n");
b=0;
for(a=0;i[a]!='#';a++)
{
if(i[a]>='a'&&i[a]<='z')
printf("%c",i[a]);
else
{
if((i[a]=='+'||i[a]=='-'||i[a]=='*'||i[a]=='/')&&b==0)
{
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='*'||j[b-1]=='/')&&(i[a]=='+'||i[a]=='-'))
{
b--;
printf("%c",j[b]);
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='+'||j[b-1]=='-')&&(i[a]=='*'||i[a]=='/'))
{
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='-'||j[b-1]=='+')&&(i[a]=='+'||i[a]=='-'))
{
b--;
printf("%c",j[b]);
j[b]=i[a];
b++;
}
else if(b>0&&(j[b-1]=='*'||j[b-1]=='/')&&(i[a]=='*'||i[a]=='/'))
{
b--;
printf("%c",j[b]);
j[b]=i[a];
b++;
}
else if(b>0&&j[b-1]=='('&&(i[a]=='+'||i[a]=='-'||i[a]=='*'||i[a]=='/'))
{
j[b]=i[a];
b++;
}
if(i[a]=='(')
{
j[b]='(';
b++;
}
else if(i[a]==')')
{
b--;
while(j[b]!='(')
{
printf("%c",j[b]);
b--;
}
}
}
if(i[a+1]=='#')
{
b--;
while(b>=0)
{
printf("%c",j[b]);
b--;
}
}
}
printf("\n");//后缀。
return 0;
}
前缀和后缀差别是前缀是从后向前遍历,而且括号的判定是相反的,还有前缀优先级相等的时候进入的栈里面而不是输出。