评估布尔表达式值的算法

时间:2013-05-26 17:53:09

标签: boolean expression evaluate

我接受过编程采访,其中包括3名采访者,每人45分钟。 虽然前两位采访者给了我2-3个简短的编码问题(即反向链接列表,使用rand(5)实现rand(7)等)第三位采访者使用整个时间段进行单一问题:

  

您将获得正确形成并带括号的字符串   布尔表达式,由字符T,F,&,|,!,(,)组成   空间。 T代表True,F代表False,&对于逻辑AND,|对于   逻辑或,!否定。 &安培;优先于|。任何这些   chars之后是输入字符串中的空格。我是要评估价值   表达式并打印它(输出应为T或F)。示例:输入:   ! (T | F& F)输出:F

我尝试实现Shunting Yard算法的变体来解决问题(以后缀形式转换输入,然后评估后缀表达式),但未能在给定的时间范围内正确编码,所以我最终解释了伪代码和我想要的话。

我的招聘人员说,前两位面试官给了我“HIRE”,而第三位面试官给了我“NO HIRE”,由于最终决定是“合乎逻辑的”,他感谢我的时间。

我的问题: 你认为这个问题适合大约在白板上的代码。 40分钟?对我来说,似乎很多代码都是为了这么短的时间段和白板的尺寸。 是否有比使用调车码算法更短的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

嗯,一旦你对解析器有一些经验,postfix算法就很简单了。 1.从左到右评估每个字符: 如果是它的操作数,就按下堆栈。 如果它的运算符弹出A,然后弹出B然后将B操作数A推入堆栈。堆栈上的最后一项将是结果。如果没有或多于一个意味着你做错了(假设后缀符号有效)。

Infix到postfix也很简单。话虽如此,如果您不了解算法,我认为这不是40分钟的合适任务。这是我在某个阶段编写的布尔后缀评估方法(也使用Lambda):

public static boolean evaluateBool(String s)
{
    Stack<Object> stack = new Stack<>();
    StringBuilder expression =new StringBuilder(s);
    expression.chars().forEach(ch->
    {
        if(ch=='0') stack.push(false);  
         else if(ch=='1') stack.push(true); 
          else if(ch=='A'||ch=='R'||ch=='X')
          {
              boolean op1 = (boolean) stack.pop();
              boolean op2 = (boolean) stack.pop();
              switch(ch)
              {
                case 'A' : stack.push(op2&&op1); break;
                case 'R' : stack.push(op2||op1); break;
                case 'X' : stack.push(op2^op1); break;
              }//endSwitch  
          }else 
              if(ch=='N')
                {
                  boolean op1 = (boolean) stack.pop();
                  stack.push(!op1);
                }//endIF
    });
    return (boolean) stack.pop();
}

在你的情况下使它工作(使用那个片段)你首先必须解析表达式并用像字母一样简单的东西替换像“!”,“|”,“^”等特殊字符或只使用整数字符在if情况下的价值。