对于可以具有不同状态的结构,我应该使用哪种设计模式?

时间:2015-03-12 14:30:42

标签: c++ oop design-patterns data-structures tree

我正在制作一个程序,根据运算符优先级将数学方程式构建到树中,例如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 ++来实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:1)

为了评估方程式,您可以使用解释器模式: https://github.com/iluwatar/java-design-patterns#interpreter

为简化代码并避免算法中的显式空值检查,我建议您尝试Null对象模式: https://github.com/iluwatar/java-design-patterns#null-object

这些例子都是用Java编写的,但希望你能得到这个想法。