0

接尾辞の算術式を評価するプログラムを書こうとしています。プログラムは文字列を私の関数evaluatePostfixに送信します。関数はオペランドと演算子を識別し、整数の解を考え出します。このプログラムでは、スキャンされた文字が識別されたときにそれをプッシュし、評価が必要なときに適切なポップ機能を実行することで、スタックを操作しています。しかし、今のところ、プログラムが無限ループのように見えるものにぶら下がっているという問題があります。最初の文字を評価した後、文字列内の次の文字に進むように関数に指示する方法がよくわからないと思います。もう1つの注意点は、ユーザーが各オペランドと演算子の間にスペースを入れることです。これが私の関数です:

int evaluatePostfix(char *postfixStr)
{
    stack * s;
    int x, y;

    stackInit(&s);

    do {
        if(isOperand(postfixStr) == 1) {
            stackPush(&s, postfixStr);
        }

        if(isOperator(postfixStr) == 1) {
            y = atoi(stackPop(s));
            x = atoi(stackPop(s));
            char *str = malloc(10 * sizeof(char));
            sprintf(str, "%d", applyOperator(x, y, postfixStr));
            stackPush(&s, str);
        }

    } while (postfixStr != NULL);
    return stackPop(s);
}

スタックを操作する関数は、インストラクターから提供されたものであるため、正しいことを知っています。誰かが私に何が欠けているのかについての手がかりを教えてもらえますか?

4

1 に答える 1

0

while条件をに変更してwhile (++postfixStr != NULL)、ポインタを。の次の文字にインクリメントすることができますpostfixStr

この増分は、次の文字がと比較されるように、プレフィックス表記(++varvs )を使用して行われます。使用しているスタック関数の動作に慣れていませんが、ループをループに変更し、そのwhileループのブロックの最後でインクリメントすることをお勧めします。var++NULLdo { ... } while (++postfixStr != NULL);while (postfixStr != NULL) { ... }postfixStr

最も安全な方法は、関数に文字列の長さパラメータを追加することです。

int evaluatePostfix(char *postfixStr, int strLength)

0次に、インデックスの文字列の先頭からインデックスに明示的にステップするループを使用しますstrLength - 1。これにより、空の文字列とNULLで終了しない文字列が安全に処理されます。

于 2012-02-19T03:23:03.213 に答える