我使用Java,在我的应用程序中,我必须将二进制表达式树转换为数学短语(带有终端,运算符和括号)。
第一部分是将树转换为后缀表示法,我成功了,但第二部分(后缀为数学短语)给我带来了麻烦。
以下是代码:
public static String postfixInterpret(String postfix) {
Stack<Character> stack = toStack(postfix);
Stack<String> expression_stack = new Stack<>();
Stack<String> temp_stack = new Stack<>();
System.out.println(postfix);
while (!stack.empty()) {
if (Tree.getTERMINALS().indexOf(stack.peek()) > -1) {
expression_stack.push(stack.pop().toString());
}
else {
for (int i = 0; i < 2; i++) {
if (!expression_stack.empty()) {
temp_stack.push(expression_stack.pop());
} else {
temp_stack.push("Null");
}
}
String expression_create = "(" + temp_stack.pop() + " " + stack.pop() + " " + temp_stack.pop() + ")";
expression_stack.push(expression_create);
}
}
return expression_stack.pop();
}
else
中带有for
循环的部分是为了确保只有一个孩子的子树仍然会成为逻辑短语,因此 + 带有 A 和 B 子节点的节点将会出现&#34; A + B&#34; 我想要 + 仅包含 A 子节点的节点将生成短语&#34; A + Null&#34; 。
我对它进行了调试,发现当我的前缀表示法中只有一个终端和一个后面的运算符,并且expression_stack
已经包含了某些内容时,该短语不是真的。
例如:
这棵树:
给我"BH|%GI*|^E+AF++|%"
使用简单的递归&#34;树来后缀&#34;我做的功能,这是对的。
但不是:((((B|H) % Null) ^ ((G*I) | Null)) % (Null | ((Null + E) + (A + F))))
我得到:(Null % (Null | (((Null ^ ((Null % (B | H)) | (G * I))) + E) + (A + F))))
我尝试慢慢调试,但我找不到解决此问题的方法。我的功能有什么问题?