算术表达式的转换

Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

Input
输入一算术表达式,以’#'字符作为结束标志。(数据保证无空格,只有一组输入)

Output
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。

Sample Input
a*b+(c-d/e)*f#

Sample Output
+ab-c/def
ab+c-d/ef
abcde/-f+

#include<stdio.h>
#include<string.h>
int findx(char ch)//后缀表达式中的优先级
{
    if(ch=='(')
        return 0;
    else if(ch==')')
        return 3;
    else if(ch=='+'||ch=='-')
        return 1;
    else
        return 2;
}
int findy(char ch)//前缀表达式中的优先级
{
    if(ch=='(')
        return 3;
    else if(ch==')')
        return 0;
    else if(ch=='+'||ch=='-')
        return 1;
    else
        return 2;
}
int main()
{
     /*
         数组str[]来储存最初的输入;
         数组send[]来储存最后的输出;
         数组s[]来充当栈,临时保存操作符;
     */
    char s[10010];
    char send[10010];
    char str[10010];
    int top=0,i,len,j;
    scanf("%s",str);
    len=strlen(str);
    top=0;
    j=0;
    for(i=len-1; i>=0; i--)//前缀,从右向左扫描
    {
        if(str[i]=='#')
            continue;
        if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
        {
            send[j++]=str[i];
        }
        else
        {
            if(top==0)
            {
                s[++top]=str[i];
            }
            else
            {
                if(str[i]==')')
                {
                    s[++top]=')';
                }
                else if(findy(str[i])<findy(s[top]))
                {
                    send[j++]=s[top];
                    s[top]=str[i];
                }
                else if(str[i]=='(')
                {
                    while(s[top]!=')')
                    {
                        send[j++]=s[top];
                        top--;
                    }
                    top--;
                }
                else
                {
                    s[++top]=str[i];
                }
            }
        }
    }
    while(top!=0)
    {
        send[j++]=s[top];
        top--;
    }
    for(i=j-1; i>=0; i--) //反着输出
    {
        printf("%c",send[i]);
    }
    printf("\n");
    for(i=0; i<len; i++) //中缀
    {
        if(str[i]=='('||str[i]==')'||str[i]=='#')
            continue;
        else
            printf("%c",str[i]);
    }
    printf("\n");
    for(i=0; i<len; i++)//后缀,从左向右扫描
    {
        if(str[i]=='#')
            break;
        if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
        {
            printf("%c",str[i]);
        }
        else
        {
            if(top==0)
            {
                s[++top]=str[i];
            }
            else
            {
                if(str[i]=='(')
                {
                    s[++top]='(';
                }
                else if(findx(str[i])<=findx(s[top]))
                {
                    printf("%c",s[top]);
                    s[top]=str[i];
                }
                else if(str[i]==')')
                {
                    while(s[top]!='(')
                    {
                        printf("%c",s[top]);
                        top--;
                    }
                    top--;
                }
                else
                {
                    s[++top]=str[i];
                }
            }
        }
    }
    while(top!=0)
    {
        printf("%c",s[top]);
        top--;
    }
    printf("\n");
    getchar();
    getchar();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值