0

スタックを使用して後置式を評価するプログラムを作成する割り当てが与えられました。

私はプログラムを書きましたが、ほとんどの場合は機能しているようですが、式が有効かどうかを判断する際に問題が発生しています。

私が行った基本的な手順は次のとおりです。

  1. ユーザーに式の入力を求める (文字列として保存)
  2. 各文字を繰り返し処理し、文字がオペランド、演算子、スペース、または無効な文字であるかどうかを判断します
  3. if(char == operand) スタックにプッシュ
  4. if(char == operator) 2回ポップして演算を行い、結果をスタックにプッシュします
  5. ループ外 if(!stack.empty()) result == stack.top, stack.pop
  6. そうでなければ無効な式

したがって、スタックがすでに空の場合、上記はうまく機能しますが、スタックにさらにオペランドがある場合、結果は単純に出力されます。スタック上に複数のオペランドがまだある場合は無効な式になるため、これは明らかに正しくありません。

私はやるべきだと思っていましたwhile(!stack.empty()) result = stack.top, stack.pop()が、これにはまだ同じ問題があります。

誰かがそれを適切にテストする方法を教えてもらえますか?

コード:

int main() 
{
    string expression;
    char response;
    int result = -1;        //result of expression. Initialized to -1
    Stack stack;

    printMenu();

    do {
        cout << "Would you like to enter an expression? (y / n)" << endl;
        cin >> response;
        response = toupper(response);

        switch(response) 
        {
            case 'Y':
                //needed due to new line
                cin.ignore();
                doWork(stack, expression, result);
                break;
            case 'N':
                cout << "Exiting program." << endl;
                break;
            default:
                cout << "Invalid response. Try again." << endl;
        }

    } while(response != 'N');

    return EXIT_SUCCESS;
}

doWork (心配しないでください。名前は変更されます) 関数:

void doWork(Stack stack, string expression, int result)
{
    cout << "Enter a PostFix expression: ";
    getline(cin, expression);

    for(int i = 0; i < expression.size(); i++)
    {
        if(expression[i] == ' ') {
            //do nothing
        } else if(isInteger(expression[i])) {
           stack.push(convertChar2Int(expression[i]));
        } else if(isOperator(expression[i])) {
           // pop last 2 ints from stack and do arithmetic on them 
           int a = stack.top();
           stack.pop();
           int b = stack.top();
           stack.pop();
           // push result onto stack 
           stack.push(calculate(a, b, expression[i]));
        } else {
           //cerr : enter different expression
           cout << expression[i] << " is an invalid character." << endl;
        }
    }

    //the result should be the top of stack
    // THIS IS WHERE MY ISSUE IS
    if(!stack.empty()) {
        result = stack.top();
        stack.pop();
    } else {
        cout << "Invalid expression." << endl;
    }

    cout << "Result: " << result << endl;
}
4

1 に答える 1

5

式を検証するには、複数の条件をテストする必要があります。

  • 式の検証中、スタックが空になることはありません。つまりstack.empty()、引数を演算子にポップしている間は get しないでください。
  • 式の評価が完了すると、スタックには正確に 1 つの要素が含まれているはずです。これは、次の手順で判断できます (Stack現在のスタックの深さを返すメソッドがない場合)。
    1. まず、スタックが空かどうかを確認します。ある場合: エラー。
    2. 次に、潜在的な結果としてスタックの一番上をポップします。脇に置きます。
    3. ここで、スタックが空かどうかをもう一度確認します。でない場合: エラー。
    4. 最後に、エラーなしでここまでたどり着いた場合は、潜在的な結果を最終結果として返します。

それはそれを行う必要があります。

于 2013-11-10T21:32:05.970 に答える