算术表达式的转换

算术表达式的转换

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;
}

前缀和后缀差别是前缀是从后向前遍历,而且括号的判定是相反的,还有前缀优先级相等的时候进入的栈里面而不是输出。

猜你喜欢

转载自blog.csdn.net/the_city_of_the__sky/article/details/80524167