0

ブール値の後置表記を処理するには、ADT 文字スタックを作成する必要があります。

これは、後置表記の 1 つの例です。

TT && F || ! (これが入力テキストになります)

これが false と評価されることはわかっています。

私の質問はです。

この表記は、コードでどのように表示されますか。(入力文字列が解析されたら)

私の推測は次のとおりです。

if ( !( true && true || false) )
    //do something;
else
    //do something else

私はこれが間違っているとかなり確信しており、私は的外れであり、あらゆる種類の組み合わせを試しました. falseを返すことはできません。

4

3 に答える 3

4

通常、RPN はスタック単位で解釈され、二項演算子はスタックから 2 つの引数をポップし、単項演算子は 1 つをポップします。

  1. T T— 2 つの真の値をスタックにプッシュします。スタックは次のとおりです: T T,
  2. &&— pushes:T && Tの 2 つの値をポップします。スタックは: ですT
  3. F— スタックにfalseをプッシュします。スタックは: ですT F
  4. ||— 2 つの値をポップ、プッシュまたは: T || F、スタックは: T
  5. !— 1 つの値をポップし、否定されたバージョンをプッシュします: !T、スタックは:Fです。

したがって、最終結果はこれらの操作の結果です(下から上に書かれています):

bool result = !(false || (true && true));

最後から読むだけです。最初にプレフィックス表記に変換すると、少し簡単になる場合があります (下から上へ):

! ( || ( F && ( T T ) ) )

次に、二項演算子を括弧内に移動します。

! ( || ( F && ( T    T ) ) )
     -----> ----->
! (      F || ( T && T ) )
于 2012-08-26T21:19:18.440 に答える
2

あなたの主な問題は、if条件が評価されたものとは反対の結果を返すためです (ablm コメントを参照)。ただし、一般的には、正しい結果を得るために、評価されたすべての式を括弧で囲む必要があります。

return !((true && true) || false);

このように、ターゲット言語 (C/C++) の演算子の優先順位が意図した計算順序と異なっていても、式は希望どおりに評価されます。

于 2012-08-26T21:17:45.360 に答える
0
if ( !( true && true || false) ) <-- this is false
    return false; <-- this evaluates if expression inside if is true, which is not
else
    return true; <--- if expression inside if is false then this(true) is returned.

したがって、適切な返品タイプを得るには、返品を交換する必要があります。

if ( !( true && true || false) )
    return true;
else
    return false;
于 2012-08-26T21:16:07.443 に答える