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

时间:2014-03-10 18:03:04

标签: c++ data-structures user-input mathematical-expressions boolean-algebra

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

2 个答案:

答案 0 :(得分:2)

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

  • 您首先处理找到最高优先级项目的文字表示
  • 每个简单语句(例如true OR false)都将放入节点
  • 您可以为不同的操作设置不同类型的节点
  • 节点本身可以​​插入其他节点,以制作复杂的陈述

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

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

这将代表声明:

true OR (false AND NOT true)

答案 1 :(得分:1)

二叉树就是答案。

假设您有表达式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