布尔后缀表示法

时间:2012-08-26 21:07:51

标签: c++ c math abstract-data-type

我必须编写一个ADT字符堆栈来处理布尔值的后缀表示法。

这是其中一个后缀符号的示例。

T&& F || ! (这将是输入文本)

我知道这评估为假。

我的问题是。

这种符号最终会在代码中看起来像什么。 (一旦解析了输入字符串)

我的猜测是:

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

我很确定这是错的,我的方式不合适, 我尝试了各种各样的组合。 我无法让它返回虚假。

3 个答案:

答案 0 :(得分:4)

你通常用堆栈方式解释RPN,二元运算符从堆栈中弹出两个参数,并且一元一个。

  1. T T - 将两个 true 值推送到堆栈,堆栈为:T T
  2. && - 弹出两个值,推送T && T,堆叠为:T
  3. F - 将 false 推送到堆栈,堆栈为:T F
  4. || - 弹出两个值,推送T || F,堆叠为:T
  5. ! - 弹出一个值,推送否定版本:!T,堆叠为:F
  6. 所以你的最终结果是这些操作的结果(从下到上编写):

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

    你只需要从头开始阅读;首先转换为前缀表示法(从下到上)可能会更容易一些:

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

    然后你只需在括号内移动二元运算符:

    ! ( || ( F && ( T    T ) ) )
         -----> ----->
    ! (      F || ( T && T ) )
    

答案 1 :(得分:2)

你的主要问题应该是因为你从if条件评估的结果返回(见ablm评论)。但一般来说,您应该将每个评估的表达式包装在括号中以确保正确的结果:

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

这样,即使目标语言(C / C ++)中的运算符的优先级与预期的计算顺序不同,表达式仍将按照您想要的方式进行计算。

答案 2 :(得分: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;