C语言 中缀表达式

2025-04-04 19:55:39
推荐回答(1个)
回答1:

写了个,你试试。

#include 

#define is_digit(ch)    ((ch) >= '0' && (ch) <= '9')

char pri[7][7] =
{
    {'>','>','<','<','<','>','>'},
    {'>','>','<','<','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'<','<','<','<','<','=','$'},
    {'>','>','>','>','$','>','>'},
    {'<','<','<','<','<','$','='},
};

int get_cal_index(char c)
{
    switch(c)
    {
        case '+': return 0;
        case '-': return 1;
        case '*': return 2;
        case '/': return 3;
        case '(': return 4;
        case ')': return 5;
        case '#': return 6;
    }
    return -1;
}

int main(void)
{
    char infix[200];
    char suffix[200];
    char cal[200];
    char *np,*ip,*sp,*cp;
    int nci, oci;

    gets(infix);
    infix[strlen(infix) +1] = '\0';
    infix[strlen(infix)] = '#';
    cal[0] = '#';

    ip = infix;
    sp = suffix;
    cp = cal;
    while(*ip)
    {
        if(is_digit(*ip))
        {
            int has_dot = 0;
            while(is_digit(*ip) || *ip == '.')
            {
                *sp++ = *ip;
                *sp++ = ' ';
                if(*ip == '.')
                {
                    if(has_dot)
                    {
                        printf("错误的计算数");
                        exit(-1);
                    }
                    has_dot = 1;
                }
                ip++;
            }
            ip--;
        }
        else
        {
            nci = get_cal_index(*ip);
            if(nci == -1)
            {
                printf("错误的运算符");
                exit(-1);
            }
            oci = get_cal_index(*cp);
            while(pri[oci][nci] == '>')
            {
                *sp++ = *cp--;
                *sp++ = ' ';
                oci = get_cal_index(*cp);
            }
            if(pri[oci][nci] == '<')
            {
                *++cp = *ip;
            }
            else if(pri[oci][nci] == '=')
            {
                if(*ip == ')')
                    cp--;
                else if(*ip == '#')
                    break;
            }
            else if(pri[oci][nci] == '$')
            {
                printf("错误的表达式");
                exit(-1);
            }
        }
        ip++;
    }

    *sp = '\0';
    puts(suffix);

    return 0;
}