我正在制作一个程序,根据运算符优先级将数学方程式构建到树中,例如x^2+5*x+1
成为
/ \
/ \
x^2+5*x + 1
/ \
/ \
x^2 + 5*x
/ \ / \
x ^ x 5 * x
我一直用于树的结节的数据结构是
struct node
{
std::string eq;
oper op;
node * LHS;
node * RHS;
};
其中oper
由
enum oper { NONE, ADD, SUB, MULT, DIV, EXP };
因此,我在上面绘制的树的根节点可以表示为
{ "x^2+5*x+1", PLUS, ->{ "x^2+5*x", PLUS, ..., ... }, ->{"1", NONE, NULL, NULL} }
如果这是有道理的。
当我编写我的算法来构建这个树时,我意识到当这个树被构建时,它的节点有不同的“状态”,这使得我的代码在处理状态时变得混乱和重复。例如,我有一些像
的代码块 if (rootNode == nullptr)
{
rootNode = new node;
rootNode = thisNode;
}
else
{
if (rootNode->RHS == nullptr)
{
rootNode->RHS = thisNode;
}
else
{
if (thisNode->op < rootNode->op)
{
node * temp = rootNode;
rootNode = thisNode;
rootNode->LHS = temp;
}
else
{
rootNode->RHS = thisNode;
}
}
}
以及我正在检查指针是否为NULL
并试图确定node
已构建多少和yada-yada的其他内容。我觉得我应该将node
对象从struct
更改为class
es并找出一些使事情变得更清洁的方法,以及节点所具有的某种“状态”,等同于“有一个左侧和一个操作员但没有右侧”等等。
关于如何利用C ++来实现这一目标的任何想法?
答案 0 :(得分:1)
为了评估方程式,您可以使用解释器模式: https://github.com/iluwatar/java-design-patterns#interpreter
为简化代码并避免算法中的显式空值检查,我建议您尝试Null对象模式: https://github.com/iluwatar/java-design-patterns#null-object
这些例子都是用Java编写的,但希望你能得到这个想法。