0
点赞
收藏
分享

微信扫一扫

7-4 表达式转换 (40 分)(C语言版)

爱动漫建模 2022-03-19 阅读 57
c语言

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

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

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

输入样例:

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

输出样例:

2 3 7 4 - * + 8 4 / +
#include<stdio.h>
#define N 10000
int level(char a,char b);
void infix_to_suffix(char *infix,char *suffix);
int main()
{
    char infix[N], suffix[N];
    scanf("%s",infix);
    infix_to_suffix(infix,suffix);
    printf("%s",suffix);
    return 0;
}
int level(char a,char b)
{
    if(b=='('){
        return 1;
    }else if((b=='*' || b=='/')&&(a=='+'||a=='-'||a=='(')) {
        return 1;
    }else if((b=='+' || b=='-')&&(a=='(')){
        return 1;
    }else{
        return 0;
    }
}

void infix_to_suffix(char *infix,char *suffix)
{
    char stack[N];
    int top=-1;
    int i,j=0;
    
    for(i=0;infix[i]!='\0';i++) {
        if((infix[i]=='-'||infix[i]=='+')&&i==0){
            suffix[j++]=infix[i];
        }else if(infix[i]=='.'){
            suffix[j++]=infix[i];
        }else if(infix[i]>='0' && infix[i]<='9') {
            suffix[j++] = infix[i];
        }else {
            if((infix[i]=='+')&&infix[i-1]=='('){
                continue;
            }
            if(i!=0 && (infix[i-1]>='0'&&infix[i-1]<='9')) {
                suffix[j++] = ' ';
            }
            
            if(infix[i]==')') {
                while(stack[top]!='(') {
                    suffix[j++] = stack[top--];
                    suffix[j++] = ' ';
                }
                top-=1;
            }else if(top==-1|| level(stack[top],infix[i])) {
                stack[++top] = infix[i];
            }else {
                while(!level(stack[top],infix[i])) {
                    suffix[j++] = stack[top--];
                    suffix[j++] = ' ';
                    if(top==-1){
                        break;
                    }
                }
                stack[++top] = infix[i];
            }
        }
    }
    
    if(top!=-1 && suffix[j-1]!=' ') {
        suffix[j++] = ' ';
    }
    while(top>0) {
        suffix[j++] = stack[top--];
        suffix[j++] = ' ';
    }
    suffix[j++] = stack[top];
    suffix[j] = '\0';
}

举报

相关推荐

0 条评论