Data structures 代数方程的数据结构?

Data structures 代数方程的数据结构?,data-structures,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

我正在尝试制作一个应用程序,它被输入一个代数方程,并为用户选择的给定变量求解

下面是伪代码

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
我需要将这些信息存储在某种数据结构中,以便对其进行解析。正如我在上面编写
LinkedList
时所看到的,它可以工作,但我无法实现操作符

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

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

// Right side of the equals sign
{ NULL <-> x <-> Operator.ADD <-> Expression: (x - 5) <-> NULL }
//等号的左侧
{NULL y NULL}
//等号的右边
{NULL x Operator.ADD表达式:(x-5)NULL}

但是我不能这样做,因为
LinkedList
需要是一种数据类型,它需要是表达式。我应该如何表示运算符?

如果将表达式表示为抽象语法树,即显示公式底层结构的树结构,则使用表达式将非常容易。我强烈建议在这里研究如何使用AST;您通常使用解析算法构建它们(Dijkstra的调车场算法根据您的设置可能非常适合您),然后使用抽象方法或访问者模式遍历AST以执行所需的计算

AST通常由一个接口或一个抽象类表示树中的一个节点,然后为您遇到的每个操作符都有子类(它们表示内部节点)和“数”或“变量”等概念的子类(通常是叶子)


如果您想了解这可能是什么样子,我使用这些技术实现了一个。展示了如何使用ASTs和调车场算法。

嘿,谢谢你这么好的回复。我是计算机科学三年级的学生,但我以前从未听说过这些。我在网上查看了一下,发现AST在尝试实现之前只是用来显示问题的。这就是你的意思吗?我需要更多地思考如何充分充实这个想法?我很困惑。AST肯定在实际软件中被用来解决各种问题(它们在编译器中被用来表示输入程序)。我怀疑您可能需要进行更多的搜索。只是要确保,AST就像java中的树映射,但没有提供类型,对吗?例如
TreeMap x=新的TreeMap哦,那不是一回事。你可能在想ADT(抽象数据类型),而不是AST(抽象语法树)。好吧,我想我明白你的意思了。你的意思是我应该创建一个子类或一个接口,让
操作符和
术语共享,这样我就可以选择一个数据结构,因为
操作符和
术语都是
MySubclass
类型。在发布这个问题之前,我曾考虑过这个问题,但我认为这是一个真正的创可贴解决方案。除非我误解了你,我可以建议你把它作为术语的一个子类吗?作为一种关系,哪一种关系必须有上一个和下一个元素的约束?我理解你的意思有点困难?你的意思是让我的术语类有两个字段(右边和左边)来通知它左边或右边的运算符是什么?在你的例子中,术语在一个链表中。最终,链表的元素会保存对该列表上一个和下一个元素的引用。假设操作符是带有附加规则的术语(子类):它们两边都有文字术语或表达式。现在,忘记我说的,遵循templatetypedef建议,而是使用抽象语法树:叶子和节点自然携带这些属性。
// Left side of the equals sign
{ NULL <-> y <-> NULL }

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