题目点击打开链接
算术表达式的转换
Time Limit: 1000MS Memory limit: 65536K
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
提示
来源
示例程序
#include <stdio.h>
#include <string.h>
int find(char x)
{
if(x=='+'||x=='-')return 1;
if(x=='*'||x=='/')return 2;
if(x=='(')return 3;
if(x==')')return 4;
}
int main()
{
int i,j,k;
char s[1111],m[1111],zhan[1111],c;
scanf("%s",s);
i=strlen(s)-2;
j=0;
k=0;//qian
while(i>=0)
{
c=s[i--];
if('a'<=c&&c<='z')
{
m[j++]=c;
}
else
{
if(k==0||c==')')
{
zhan[k++]=c;
}
else
{
if(c=='(')
{
while(zhan[k-1]!=')')
{
m[j++]=zhan[k-1];
k--;
}
k--;
}
else
{
if(find(zhan[k-1])>find(c))//此处没有等于
{
if(zhan[k-1]!=')')
{
m[j++]=zhan[k-1];
k--;
}
zhan[k++]=c;
}
else zhan[k++]=c;
}
}
}
}
while(k>0)
{
m[j++]=zhan[k-1];
k--;
}
for(i=j-1; i>=0; i--)
{
printf("%c",m[i]);
}
printf("\n");
//zhong
i=0;
while(s[i]!='#')
{
if(s[i]!='('&&s[i]!=')')
printf("%c",s[i]);
i++;
}printf("\n");
i=0;
j=0;
k=0;//hou
while(s[i]!='#')
{
c=s[i++];
if('a'<=c&&c<='z')
{
m[j++]=c;
}
else
{
if(k==0||c=='(')
{
zhan[k++]=c;
}
else
{
if(find(zhan[k-1])>=find(c))//此处有同级输出
{
if(find(zhan[k-1])!=3)
{
m[j++]=zhan[k-1];
k--;
}
zhan[k++]=c;
}
else
{
if(c==')')
{
while(zhan[k-1]!='(')
{
m[j++]=zhan[k-1];
k--;
}
k--;
}
else zhan[k++]=c;
}
}
}
}
while(k>0)
{
m[j++]=zhan[k-1];
k--;
}
for(i=0; i<j; i++)
{
printf("%c",m[i]);
}
printf("\n");
return 0;
}