2015-03-12 2 views
0

Я делаю программу, которая строит математические уравнения в дерево на основе приоритета оператора, например. 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++ для этого?

+0

Возможно, принятый ответ на это может быть отправной точкой, по крайней мере? http://stackoverflow.com/questions/17806760/binary-expression-tree-c –

+0

Я бы сменил структуры на классы, использовал наследование для моделирования различных типов операторов и инкапсулировал различное поведение в этих классах. Во время строительства я бы удостоверился, что узлы получат все свои данные в конструкторе и останутся неизменными после этого, если только вы не захотите манипулировать древовидной структурой позже. –

+1

Не ответ, потому что я не уверен, что это правильное решение для этого случая, но состояние может быть обработано [state pattern] (http://en.wikipedia.org/wiki/State_pattern) – stefaanv

ответ

1

Для оценки уравнений можно использовать шаблон Interpreter: https://github.com/iluwatar/java-design-patterns#interpreter

Чтобы упростить код и избежать явного нуль проверки в ваших алгоритмов я хотел бы предложить вам попробовать Null шаблон объекта: https://github.com/iluwatar/java-design-patterns#null-object

Примеры на Java, но, надеюсь, вы получите эту идею.

Смежные вопросы