Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将中缀转换为二叉树_Java_Binary Tree_Infix Notation - Fatal编程技术网

Java 将中缀转换为二叉树

Java 将中缀转换为二叉树,java,binary-tree,infix-notation,Java,Binary Tree,Infix Notation,如何将中缀表达式转换为树?我想手动操作,而不是先编程。例如,让我们看看这个中缀表达式: b = (x * a) - y / b * (c + d) 把它变成树的规则是什么?或者你建议采取什么步骤来实现这一点?我在这里遇到了麻烦,因为有时这些表达式中没有显式括号: b = x * a - y / b * c + d 您在这里描述的问题通常称为表达式解析,该过程通常有两个步骤: 首先是扫描,将输入字符串拆分为一组较小的逻辑单元,每个逻辑单元代表一个输入“片段”。例如,给定输入字符串 b = x

如何将中缀表达式转换为树?我想手动操作,而不是先编程。例如,让我们看看这个中缀表达式:

b = (x * a) - y / b * (c + d)
把它变成树的规则是什么?或者你建议采取什么步骤来实现这一点?我在这里遇到了麻烦,因为有时这些表达式中没有显式括号:

b = x * a - y / b * c + d

您在这里描述的问题通常称为表达式解析,该过程通常有两个步骤:

首先是扫描,将输入字符串拆分为一组较小的逻辑单元,每个逻辑单元代表一个输入“片段”。例如,给定输入字符串

b = x * a - y / b * c + d
您可以生成以下令牌序列:

[b] [=] [x] [*] [a] [-] [y] [/] [b] [*] [c] [+] [d]
通过这种方式,您可以从“输入是一个字符序列”移动到“输入是一个单个变量、运算符等的序列”。执行此步骤的方法有很多,通常包括手动执行字符串处理或使用正则表达式(如果您熟悉这些方法)。作为第一步,看看你是否能让这部分工作

第二步,可能是你最担心的一步,是解析,在这里,你获取标记序列并重建语句的含义。这通常包括算出运算符优先级,并实际构建所需的树结构。顺便说一下,这棵树通常被称为表达式树或(AST)

有很多方法可以做到这一点。对于解析表达式,我个人的目标是。该算法通过维护两个堆栈并一次处理一个令牌来工作,使用堆栈来确定应该应用哪些运算符


如果你想看一个如何做到这一点的例子,我为我经常教的离散数学课程建立了一个模型。您键入一个逻辑表达式,代码扫描它以获得令牌序列,然后使用调车场算法构建AST,然后使用AST生成真值表工具。将分解,以便每个步骤都单独完成,这可能是一个很好的参考。

运算符/函数可能需要0到n个参数,因此通常表达式不必是二叉树。