SDUT2484 算术表达式的转换

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
a
b+c-d/e
f
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--]);
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值