Java 试图将后缀符号解释为数学短语
我正在使用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
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
中的部分是确保只有一个子树仍将成为逻辑短语,因此带有a和B子节点的+节点将产生“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个操作数。