对于可以具有不同状态的结构,我应该使用哪种设计模式?
What sort of design pattern should I be using for a structure that can have different states?
我正在制作一个程序,根据运算符优先级将数学方程式构建到树中,例如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} }
如果说得通。
当我编写我的算法来构建这棵树时,我意识到随着这棵树的构建,它的节点有不同的 "states" 这使得我的代码在尝试处理状态。例如,我有一段代码类似于
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
s 更改为 class
es 并想出一些使事情更清洁的方法,使用某种 "state" 节点有,等同于“有一个左侧和一个运算符,但没有右侧”等等。
关于如何利用 C++ 执行此操作的任何想法?
要计算方程式,您可以使用解释器模式:
https://github.com/iluwatar/java-design-patterns#interpreter
为了简化代码并避免在您的算法中进行显式空检查,我建议您尝试空对象模式:
https://github.com/iluwatar/java-design-patterns#null-object
示例在 Java 中,但希望您能理解。
我正在制作一个程序,根据运算符优先级将数学方程式构建到树中,例如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} }
如果说得通。
当我编写我的算法来构建这棵树时,我意识到随着这棵树的构建,它的节点有不同的 "states" 这使得我的代码在尝试处理状态。例如,我有一段代码类似于
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
s 更改为 class
es 并想出一些使事情更清洁的方法,使用某种 "state" 节点有,等同于“有一个左侧和一个运算符,但没有右侧”等等。
关于如何利用 C++ 执行此操作的任何想法?
要计算方程式,您可以使用解释器模式: https://github.com/iluwatar/java-design-patterns#interpreter
为了简化代码并避免在您的算法中进行显式空检查,我建议您尝试空对象模式: https://github.com/iluwatar/java-design-patterns#null-object
示例在 Java 中,但希望您能理解。