我正在尝试创建一个以代数方程式提供的应用程序,并解决用户选择的给定变量。
下面的伪代码
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
需要是一种数据类型,需要表达式。我该如何表示运营商?
答案 0 :(得分:3)
当您将表达式表示为抽象语法树,表示公式的基础结构的树结构时,使用表达式会更加容易。我强烈建议在这里研究如何使用ASTs;您通常使用解析算法构建它们(Dijkstra的分流码算法可能会根据您的设置很好地为您工作)然后使用抽象方法或访问者模式来遍历AST以执行您需要的计算。
AST通常由表示树中节点的接口或抽象类表示,然后为您遇到的每个运算符(它们代表内部节点)和子类(如&#34;数&#34;或&#34;变量&#34; (通常,他们会离开)。
如果您想了解这可能是什么样子,我使用这些技术实现了tool to generate truth tables for propositional logic formulas。 JavaScript source展示了如何使用AST和分流码算法。