0

中置式を後置式に変換したい。これは私のコードです:

問題は、これが実際にはそうしないことであり、私はその理由を混乱させています。すべてが私には理にかなっていますが、たとえば4*5出力として入力すると、同じことが得られます。infix は入力で、postfix は postfix へのポインターとして返したいもので、評価できるようにします。

* - + または / の場合、オペランドは true を返します

アップデート:

oki うまくいきましたが、5 * 3 + -1.2 のように入力した場合、負の数が必要な場合はうまくいきません。

void infix2postfix(char* infix, char* postfix){
     char *in,*post;
        Stack<char>Q;
        char n;
        in = &infix[0];
        post = &postfix[0];
        while(*in){
            while(*in == ' ' || *in == '\t'){
                in++;
            }
            if( isdigit(*in) || isalpha(*in) ){
                while( isdigit(*in) || isalpha(*in)){
                    *post = *in;
                    post++;
                    in++;
                }
            }
            if( *in == '(' ){
                Q.Push(*in);
                in++;
            }
            if( *in == ')'){
                n = Q.Pop();
                while( n != '(' ){
                    *post = n;
                    post++;
                    n = Q.Pop();
                }
                in++;
            }
            if( operand(*in) ){
                if(Q.IsEmpty())
                    Q.Push(*in);
                else{
                    n = Q.Pop();
                    while(priority(n) >= priority(*in)){
                        *post = n;
                        post++;
                        n = Q.Pop();
                    }
                    Q.Push(n);
                    Q.Push(*in);
                }
                in++;
            }
        }
        while(!Q.IsEmpty())
        {
            n = Q.Pop();
            *post = n;
            post++;

        }
        *post = '\0';
    }

これが私のコードの新しいコードです。動作しますが、単項演算子で動作するようにしたいので、 input を取る4 * 5 + 4 + -1.2ので、間にスペースがあり、そうでない場合は、たとえば -1.2 負の数です。また、私のコードは 9 を超える整数に対しては機能しません。10 を入力すると、1*0 が乗算されます。.

4

1 に答える 1

0

2 つのスタックを使用しても問題ない場合は、1 つを値用に、もう 1 つを演算子用に使用できます。

入力から値を抽出するときは、それを値スタックにプッシュし、演算子を見つけたら演算子スタックにプッシュします。

次に、出力を作成するときに、演算子スタックから 1 つの演算子をポップし、値スタックから (演算子に応じて) 1 つまたは 2 つの値をポップします。値を出力し、演算子を出力します。複数の演算子を使用する式の場合、前の操作が最初の値と見なされるため、次回は 1 つ (またはゼロ) の値をポップするだけで済みます。

もちろん、これは単純な方法であり、演算子の優先順位などを処理しません。

また、再帰降下パーサーを実行することもできます。これは、実際には明示的なスタックを使用しませんが、関数が再帰的に呼び出されるという暗黙のスタックを使用するため、スタックは実際には関数呼び出しスタックです。

于 2012-12-10T06:31:52.933 に答える