代数方程的数据结构?

时间:2016-08-30 23:54:34

标签: data-structures

我正在尝试创建一个以代数方程式提供的应用程序,并解决用户选择的给定变量。

下面的伪代码

enum Variable
    x, pi, y, z; //.. etc

class Value
double constant;
Variable var;

class Term
Value val;              // Might be a variable or a constant
Expression exponent;    // The exponent of this term
boolean sign;           // Negative flag

class Expression
LinkedList<Term>;       // All the terms in this expression
^ This is what I need help on.

Expression exponent;    // The exponent of this term

例如,平均等式可能是:

y           =       x        +              (x - 5)^z
^term               ^term    ^ operator     ^ expression^term

我需要将这些信息存储在某种数据结构中,然后才能解析它。正如您在上面写LinkedList<Term>时看到的那样,它可以正常工作,但我无法实现运算符

使用上面的例子,我希望我的数据结构如下所示:

// Left side of the equals sign
{ NULL <-> y <-> NULL }

// Right side of the equals sign
{ NULL <-> x <-> Operator.ADD <-> Expression: (x - 5) <-> NULL }

我不能这样做,因为LinkedList需要是一种数据类型,需要表达式。我该如何表示运营商

1 个答案:

答案 0 :(得分:3)

当您将表达式表示为抽象语法树,表示公式的基础结构的树结构时,使用表达式会更加容易。我强烈建议在这里研究如何使用ASTs;您通常使用解析算法构建它们(Dijkstra的分流码算法可能会根据您的设置很好地为您工作)然后使用抽象方法或访问者模式来遍历AST以执行您需要的计算。

AST通常由表示树中节点的接口或抽象类表示,然后为您遇到的每个运算符(它们代表内部节点)和子类(如&#34;数&#34;或&#34;变量&#34; (通常,他们会离开)。

如果您想了解这可能是什么样子,我使用这些技术实现了tool to generate truth tables for propositional logic formulasJavaScript source展示了如何使用AST和分流码算法。