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

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 对象从 structs 更改为 classes 并想出一些使事情更清洁的方法,使用某种 "state" 节点有,等同于“有一个左侧和一个运算符,但没有右侧”等等。

关于如何利用 C++ 执行此操作的任何想法?

要计算方程式,您可以使用解释器模式: https://github.com/iluwatar/java-design-patterns#interpreter

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

示例在 Java 中,但希望您能理解。