pta 表达式转换 (C语言版) 前缀表示转中缀

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

目录

输入格式:

输出格式:

输入样例:

输出样例:


输入在一行中给出不含空格的中缀表达式,可包含+-*/以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include <stdio.h>
#include <string.h>
//此代码由浙江大学(宁波分校)学生发布,仅供学习和参考。 
int level(char n){//创建函数用于判断字符优先级, 
    if(n=='+'||n=='-')
        return 1;
    if(n=='*'||n=='/')
        return 2;
    if(n=='(')
        return -1;
    if(n==')')
        return 4;
    if(n=='=')
        return -2;
    return 0;
}
int main(){
    char a[99],data[99];
    data[0]='=';//将data栈里面data[0]字符优先级设为最低 
    int top=0,i,n,flag1,flag2,flag=0;//flag1用于标记小数点 ,flag2用于判断-1或+1,flag用于判断是否有运算数输出。 
    scanf("%s",a);
    n=strlen(a);
    for(i=0;i<n;i++){
        if(i==0&&level(a[i])==1){//此处if喝else if用于判断正数或负数。
            if(a[i]=='-'){//正数不做处理,负数要输出 
                if(a[i]=='-')
                printf("%c",a[i]);
                flag2=1;
            }
            continue;
        }else if(i>0){//应对'('出现在开头 
            if(a[i-1]=='('&&level(a[i])==1){
                if(a[i]=='-'){
                    if(a[i]=='-')
                    printf(" %c",a[i]);
                    flag2=1;
                }
                continue;
            }
        } 
        
        if(a[i]=='.'){//判断'.'出现 
            printf(".");
            flag1=1;
            continue;
        }
        
        if(level(a[i])==1||level(a[i])==2){//判断'+','-','*','/'运算符 
            while(level(a[i])<=level(data[top])){//若运算符栈里运算优先级更高或相等,则pop出来,直到出现栈里运算符更低或到栈底。 
                printf(" %c",data[top--]);
            }
            data[++top]=a[i];
        }
        else if(level(a[i])==-1){//判断'(' 
            data[++top]=a[i];
        }else if(level(a[i])==4){//判断')' ,并将
            while(level(data[top])!=-1){
                printf(" %c",data[top--]);
            }
            top--;
        }
        else{//此处是输出运算数 
            if(flag1==1){
                printf("%c",a[i]);
                flag1=0;
            }
            else if(flag2==1){
                printf("%c",a[i]);
                flag2=0;
            }
            else if(level(a[i-1])==0){//判断前一位是否为运算数,从而输出多位数字。 
                printf("%c",a[i]);
            }
            else if(flag==0){
                printf("%c",a[i]);
            }
            else
                printf(" %c",a[i]);
            flag++;
        }
    }
    for(i=top;i>=1;i--){//将栈剩余的pop出来。 
        printf(" %c",data[i]);
    }
    return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值