处理布尔代数方程的良好数据结构是什么?
What is a good data structure for processing boolean algebra equations?
我正在创建一个程序,它将计算布尔代数方程的真值。我需要找到一个良好的数据结构,将能够正确地处理涉及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
。
相关文章:
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 表示图像矩阵的理想数据结构是什么?
- 存储大量会话的最有效数据结构是什么?
- 给定 C# 代码的正确数据结构是什么
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 通常用于将输入映射到显示器的数据结构是什么
- A*开放集的最佳数据结构是什么
- C++中的地图数据结构是什么
- 可以处理随机访问和键搜索的数据结构是什么?
- C++ STL 堆栈中使用的基本数据结构是什么?
- 从中间删除元素的最佳数据结构是什么
- 设计PRIM算法最有效的数据结构是什么
- c++中顺序插入/读取/删除最快的数据结构是什么?
- 在我的神经网络程序中使用的最有效的数据结构是什么?我的程序需要动态分配吗?
- 当需要修改元素时,另一种类似集合的数据结构是什么?
- 搜索和更新整数值列表最快的数据结构是什么?
- 一般阶跃函数的最佳数据结构是什么?
- 池容器的最佳数据结构是什么?
- 构建图的最佳标准数据结构是什么?
- 插入和搜索元素最快的数据结构是什么