处理布尔代数方程的良好数据结构是什么?

What is a good data structure for processing boolean algebra equations?

本文关键字:数据结构 是什么 布尔 代数方程 处理      更新时间:2023-10-16

我正在创建一个程序,它将计算布尔代数方程的真值。我需要找到一个良好的数据结构,将能够正确地处理涉及AND, OR, NOT和括号的方程的操作顺序。公式将由用户输入。

任何类型的"操作顺序"对象通常保存在树中。它看起来像这样:

  • 处理文本表示,首先找到优先级最高的项
  • 每个简单语句(例如true OR false)将被放入一个节点
  • 对于不同的操作,可以使用不同类型的节点
  • 节点本身可以插入到其他节点中,生成复杂语句

最终的树表示可能看起来像这样:

     OR
  ___|__
  |    |
true  AND
    ___|___
    |     |
 false   NOT
          |
         true

表示语句:

true OR (false AND NOT true)

二叉树是这里的答案。

假设您有表达式A and B or C,那么您正在寻找的表示将类似于:

    or
   / 
 and  C
 / 
A   B

注意树已经编码了优先级规则。

一个简单的解决方案是这样的:

class tree_node
{
public:
    virtual ~tree_node() = default;
    virtual bool evaluate() = 0;
};
class false_literal_node : public tree_node
{
    bool evaluate() override
    {
        return false;
    }
};
// Same goes for `true` literal...
class variable_node : public tree_node
{
    bool evaluate() override
    {
        return value;
    }
    bool value;
};
class conjunction_node : public tree_node
{
    bool evaluate() override
    {
        return lhs->evaluate() && rhs->evaluate();
    }
    std::unique_ptr<tree_node> lhs;
    std::unique_ptr<tree_node> rhs;
};

你懂的…

对表达式求值就是解析它(这将得到一个树),然后在根上调用evaluate