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