Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm_Tree_Stack - Fatal编程技术网

Java 试图将后缀符号解释为数学短语

Java 试图将后缀符号解释为数学短语,java,algorithm,tree,stack,Java,Algorithm,Tree,Stack,我正在使用Java,在我的应用程序中,我必须将二元表达式树转换为数学短语(带有终端、运算符和括号) 第一部分是将树转换为后缀符号,我成功地完成了,但第二部分(数学短语的后缀)给我带来了麻烦 代码如下: public static String postfixInterpret(String postfix) { Stack<Character> stack = toStack(postfix); Stack<String> expression_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();
}
公共静态字符串后缀解释(字符串后缀){
堆栈=toStack(后缀);
堆栈表达式_Stack=新堆栈();
堆栈温度=新堆栈();
System.out.println(后缀);
而(!stack.empty()){
if(Tree.getTERMINALS().indexOf(stack.peek())>-1){
表达式_stack.push(stack.pop().toString());
}
否则{
对于(int i=0;i<2;i++){
if(!expression_stack.empty()){
temp_stack.push(表达式_stack.pop());
}否则{
临时堆栈推送(“空”);
}
}
字符串表达式_create=“(“+temp\u stack.pop()+”“+stack.pop()+”“+temp\u stack.pop()+”)”;
expression\u stack.push(expression\u create);
}
}
返回表达式_stack.pop();
}
带有
for
循环的
else
中的部分是确保只有一个子树仍将成为逻辑短语,因此带有aB子节点的+节点将产生“a+B”我想要一个+节点,其中只有一个子节点将产生短语“a+Null”

我调试了它,发现当我的前缀符号中有一个部分,后面只有一个终端和一个运算符,并且
表达式栈
中已经有一些内容时,这个短语就不是真的


例如:

这棵树:

使用我创建的简单递归“树到后缀”函数为我提供了
“BH |%GI*|^E+AF++%”
,这是正确的

而不是:
(((B | H)%Null)^((G*I)| Null))%(Null |((Null+E)+(A+F))

我得到:
(Null%(Null |)((Null^((Null%(B | H))|(G*I))+E)+(A+F)))


我尝试过缓慢地调试,但找不到解决此问题的方法。我的函数有什么问题?

所以,既然你在使用java,为什么C++标签?这两种语言是不同的。@ThomasMatthews我刚刚注意到它被编辑掉了,这是一个诚实的错误,可能是在自动标记建议中按了它,对不起。转换tree->infix就像转换postfix->infix一样简单。您想首先转换为后缀有什么特别的原因吗?您的函数应该如何知道
AB |&
是指
((a | B)&Null)
还是
(a&(B | Null))
?你需要在后缀符号中包含空值以使其不含糊。@ AgRAMANZA,但是有些运算符没有2个操作数。因此,既然使用java,为什么要使用C++标记?这两种语言是不同的。@ThomasMatthews我刚刚注意到它被编辑掉了,这是一个诚实的错误,可能是在自动标记建议中按了它,对不起。转换tree->infix就像转换postfix->infix一样简单。您想首先转换为后缀有什么特别的原因吗?您的函数应该如何知道
AB |&
是指
((a | B)&Null)
还是
(a&(B | Null))
?您需要在后缀表示法中包含空值,以使其明确。@argamanza但有些运算符没有2个操作数。