Java - 中缀计算器的数据结构

时间:2015-05-13 06:04:55

标签: java algorithm tree calculator

我想建立中缀计算器。我选择的方法是在树中解析输入,其中节点中的运算符和叶子中的操作数,然后从下到上遍历树(从高优先级运算符到下层)。

树的例子:

                         (12 + 8) / 2 - 5

                                –
                              /   \
                            '/'    5
                            / \
                           +   2    
                          / \  
                         12  8

首先:我是Java的新手,我应该选择什么样的数据结构,或者我需要用自己的树实现来创建新类?

第二:处理括号优先级的最佳方法是什么?

1 个答案:

答案 0 :(得分:5)

您应该使用将Operand子类化为OperationLiteral的小类层次结构。 Operation有一个字段用于运算符(最佳:枚举)和两个Operand字段。

解析器可以创建OperationLiteral个对象,并将其引用存储到包含Operation的内容中。

括号消失,因为生成的树(如Q中所示)将根据优先级进行组织:按括号分组,然后按操作员优先级分组,最后从左到右分组。

你可以写一个简单的递归下降解析器,不需要为这个小小的学术练习设置antlr。

稍后以下是算术表达式的简单语法的BNF:

<expression> ::= <term> | <term> <addop> <expression>
<term>       ::= <factor> | <term> <mulop> <factor>
<factor>     ::= <constant> | (" <expression> ")"
<constant>   ::= <digit> | <digit> <constant>
<addop>      ::= "+" | "-"
<mulop>      ::= "*" | "/"
<digit>      ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

递归下降解析器包括通过查找终端(括号,运算符,数字)并根据备选方案之一组成非终端来解析非终端的方法。成功时,将返回LiteralOperation对象,并将其合并到调用者组成的对象中。