0

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

这是后缀符号之一的示例。

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

我知道这评估为假。

我的问题是。

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

我的猜测是:

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

我很确定这是错误的,而且我离题了,我尝试了各种组合。我不能让它返回假。

4

3 回答 3

4

您通常以堆栈方式解释 RPN,二元运算符从堆栈中弹出两个参数和一元参数。

  1. T T— 将两个值压入堆栈,堆栈为:T T,
  2. &&— 弹出两个值,push: T && T,堆栈是: T,
  3. F— 将false压入堆栈,堆栈为:T F,
  4. ||— 弹出两个值,push: T || F,堆栈是: T,
  5. !— 弹出一个值,推送否定版本:!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 回答