0

C中置式を後置に変換し、入力した値で計算するプログラムを作成しようとしています。(2 + 14)* 5と入力すると、(2 14)5 * +になりますが、2 14 +5*になります。だから私の質問:

  1. どこで私は間違えましたか?
  2. 最後のフォーム(接尾辞)の括弧を削除するようにコードを変更するにはどうすればよいですか?

助けてくれてありがとう。

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

2 に答える 2

1

私はあなたのコードをあまり詳しく調べていませんが、特別な方法で入力の括弧を処理していないようです。それらは非常に具体的な意味を持ち、操作の WRT 順序を表します。

私の推測では、あなたのプログラムは括弧を数字と同じように扱い、入力を (左括弧と右括弧をそれぞれ L と R に置き換えて) L2 + (14R * 5) として解析しています。この場合、出力は正しいです。 .

于 2012-12-22T09:42:23.233 に答える