Я делаю программу, которая строит математические уравнения в дерево на основе приоритета оператора, например. 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
был построен и болтовня-болтовня. Я чувствую, что мне нужно менять объекты node
от struct
до class
и выяснять, как сделать вещи более чистыми, с каким-то «состоянием», которое имеет узел, эквиваленты «» имеет левую сторону и оператор, но без правой стороны еще "и так далее.
Любые идеи о том, как я могу использовать C++ для этого?
Возможно, принятый ответ на это может быть отправной точкой, по крайней мере? http://stackoverflow.com/questions/17806760/binary-expression-tree-c –
Я бы сменил структуры на классы, использовал наследование для моделирования различных типов операторов и инкапсулировал различное поведение в этих классах. Во время строительства я бы удостоверился, что узлы получат все свои данные в конструкторе и останутся неизменными после этого, если только вы не захотите манипулировать древовидной структурой позже. –
Не ответ, потому что я не уверен, что это правильное решение для этого случая, но состояние может быть обработано [state pattern] (http://en.wikipedia.org/wiki/State_pattern) – stefaanv