如何将中缀表达式转换为后缀表达式?

时间:2012-12-22 08:43:30

标签: c push pop infix-notation

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

  1. 我哪里出错了?
  2. 如何更改代码以删除最后一个表格(后缀)的括号?
  3. 感谢您的帮助。

    #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]);
    }
    

2 个答案:

答案 0 :(得分:1)

我没有在你的代码中查看太多细节,但你似乎没有以任何特殊方式处理输入中的括号;它们具有非常具体的意义WRT操作顺序。

我的猜测是你的程序正在像数字一样处理parens,并且正在解析输入为(分别代替左和paren和右paren的L和R)L2 +(14R * 5),在这种情况下输出是正确的。

答案 1 :(得分:-1)

在函数precedence中,您应该尝试

if((c=='(') || (c==')')) {
  return 3;
}