我正在尝试编写一个C程序,将中缀表达式转换为后缀,并使用输入的值进行计算。当我输入(2 + 14)* 5时,我得到(2 14)5 * +,但它应该是2 14 + 5 *。所以我的问题是:


我哪里做错了?
如何更改代码以删除最后一种形式的括号(后缀)?


谢谢你的帮助。

#include<stdio.h>
#include<string.h>
#include<math.h>

#define oper(x) (x=='+' || x=='-' || x=='*' || x=='/')

char in[30], post[30], stack[30];
int top=-1;

void push(char x)
{
    stack[++top]=x;
}

char pop()
{
    return stack[top--];
}

int precedence(char c)
{
    if (c=='+' || c=='-')
        return 1;
    if (c=='*' || c=='/')
        return 2;
    if (c=='(')
        return 3;
}

main()
{
    char c;
    int l,i,j=0,st1[20],k,h,f,eval,s,N;
    printf("Enter the infix expression : ");
    scanf("%s",&in);
    l=strlen(in);
    for(i=0;i<=l;i++)
    {
        if(oper(in[i]))
        {
            post[j++]=' ';
            while(precedence(in[i])<precedence(stack[top]))
            {
                post[j++]=stack[top];
                pop();
                post[j++]=' ';

            }
            push(in[i]);
        }
        else if(in[i]=='\0')
        {
            while(top!=-1)
            {
                post[j++]=' ';
                post[j++]=stack[top];
                pop();
            }
        }
        else
            post[j++]=in[i];
    }
    post[j]='\0';
    printf("Postfix Expression : %s\n",post);
    i=0;top=-1;f=0;k=0;
    while(i<j)
    {
        if(oper(post[i]))
        {
            f=1;
            c=post[i];
            eval=0;
            switch(c)
            {
                case '+':
                    eval=st1[top-1]+st1[top];
                    break;
                case '-':
                    eval=st1[top-1]-st1[top];
                    break;
                case '*':
                    eval=st1[top-1]*st1[top];
                    break;
                case '/':
                    eval=st1[top-1]/st1[top];
                    break;
            }
            top--;
            st1[top]=eval;
        }
        else if(post[i]==' ')
        {
            if(f==0)
            {
                h=i-k;
                s=0;
                while(post[h]!=' ')
                {
                    N=(int)post[h];
                    N=N-48;
                    s=s+N*(pow(10,(k-1)));
                    k--;
                    h++;
                }
                st1[++top]=s;
            }
            k=0;
        }
        else
        {
            k++;
            f=0;
        }
        i++;
    }
    printf("Value : %d\n",st1[top]);
}

最佳答案

我没有对您的代码进行过多的研究,但是您似乎并没有以任何特殊的方式来处理输入中的括号。它们具有非常具体的含义,WRT的操作顺序。

我的猜测是您的程序将parens当作数字对待,并且将输入解析为(分别用L和R代替左paren和右paren)L2 +(14R * 5),在这种情况下输出是正确的。

10-07 16:28
查看更多