SDUT2484 算术表达式的转换
算术表达式的转换
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
Input
输入一算术表达式,以’#'字符作为结束标志。(数据保证无空格,只有一组输入)
Output
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
Sample Input
ab+(c-d/e)f#
Sample Output
+ab-c/def
ab+c-d/ef
abcde/-f+
直接上代码
#include<cstdio>
#include<iostream>
using namespace std;
char qian(char a[]);
char hou(char a[]);
int main()
{
char a[1000];
scanf("%s",a);
qian(a);
printf("\n");
int x,y,z;
for(x=0;;x++)
{
if(a[x]=='#')
{
break;
}
else if(a[x]=='('||a[x]==')')
{
}
else
{
printf("%c",a[x]);
}
}
printf("\n");
hou(a);
}
char qian(char a[])
{
//char a[100];
char b[100];
char c[100];
// scanf("%s",a);
int x,y,z;
for(x=0;;x++)
{
if(a[x]=='#')
{
break;
}
}
z=0;
int m=0;
// printf("%d\n",x);
for(y=x-1;y>=0;y--)
{
if(a[y]>=97&&a[y]<=122)
{
b[z++]=a[y];
}
else
{
if(a[y]=='*'||a[y]=='/')
{
c[m++]=a[y];
}
else if(a[y]==')')
{
c[m++]=a[y];
}
else if(a[y]=='+'||a[y]=='-')
{
while(m>=0){
if(c[m-1]=='*'||c[m-1]=='/')
{
b[z++]=c[m-1];
m--;
}
else
{
c[m++]=a[y];
break;
}
}
}
else if(a[y]=='(')
{
while(c[m-1]!=')')
{
b[z++]=c[m-1];
m--;
}
m=m-1;
}
}
}
if(m!=0)
{
while(m>0)
{
b[z++]=c[m-1];
m--;
}
}
//printf("%d\n",b[z-1]);
while(z>0)
{ z--;
printf("%c",b[z]);
}
}
char hou(char a[])
{
char b[100];
//scanf("%s",a);
int c;
int k;
k=0;
for(c=0;a[c]!='#';c++)
{
if(a[c]>='a'&&a[c]<='z')
{
printf("%c",a[c]);
}
else if(a[c]=='(')
{
b[++k]=a[c];
}
else if(a[c]=='+'||a[c]=='-')
{
while(k!=0&&b[k]!='(')
{
printf("%c",b[k--]);
}
b[++k]=a[c];
}
else if(a[c]==')')
{
while(b[k]!='(')
{
printf("%c",b[k--]);
}
k--;
}
else if(a[c]=='*'||a[c]=='/')
{
while(k!=0&&b[k]!='('&&(b[k]=='*'||b[k]=='/'))
{
printf("%c",b[k--]);
}
b[++k]=a[c];
}
}
while(k!=0)
{
printf("%c",b[k--]);
}
}