试图将后缀表示法解释为数学短语

时间:2016-06-14 22:12:05

标签: java algorithm tree stack

我使用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已经包含了某些内容时,该短语不是真的。

例如:

这棵树:

Tree

给我"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))))

我尝试慢慢调试,但我找不到解决此问题的方法。我的功能有什么问题?

0 个答案:

没有答案