Java 从反向波兰符号(RPN)转换成树形?

Java 从反向波兰符号(RPN)转换成树形?,java,Java,我不明白怎么做?有人能解释一下如何将例如,ac+ac+*转换成二叉树形式吗??我需要将此表达式转换为此树的全括号字符串表示形式。我将使用类节点来表示树的节点。我的节点需要的全部内容如下: public interface Node<T> { public void addChild(Node<T>); } (可能需要在类中包含其他方法,以便可以从树中读取值,但这并不是构建树所必需的。) 而且 这样,下面的函数将生成一棵树,返回其根节点 public static

我不明白怎么做?有人能解释一下如何将例如,
ac+ac+*
转换成二叉树形式吗??我需要将此表达式转换为此树的全括号字符串表示形式。

我将使用类
节点
来表示树的节点。我的节点需要的全部内容如下:

public interface Node<T> {
    public void addChild(Node<T>);
}
(可能需要在类中包含其他方法,以便可以从树中读取值,但这并不是构建树所必需的。)

而且

这样,下面的函数将生成一棵树,返回其根节点

public static Node<Token> makeTree(Token [] tokens){
    Stack<Node<Token>> stack = new Stack<>();

    try{
        for(Token t:tokens){
            Node<Token> node = new TreeNode<Token>(t);
            for(int idx = 0; idx < t.getOperandCount(); idx++)
                node.addChild(stack.pop());
            stack.push(node);
        }
    }catch (EmptyStackException e){
        throw new MalformedExpressionException("too few operands");
    }

    if(stack.size() != 1)
        throw new MalformedExpressionException("too many operands");

    return stack.pop();
}
公共静态节点生成树(令牌[]令牌){
堆栈=新堆栈();
试一试{
for(令牌t:令牌){
节点=新的树节点(t);
for(int idx=0;idx
您需要按照处理后缀输入的方式构建树。但是,当遇到操作时,不计算值,而是将堆栈上的参数设置为运算符节点的子级。然后将其推送到堆栈上(就像用后缀表示法将计算结果推送到堆栈上一样)

最后,堆栈上的唯一元素应该是完整树的根

应该大致如下所示:

public class Node {
    char value;
    Node left, right;

    public Node(char value) {
        this.value = value;
    }

    public static Node parseUpn(String s) {
        Stack<Node> stack = new Stack<Node>();

        for (char c: s.toCharArray()) {
            if (c != ' ') {
                Node node = new Node(c);
                if ("+-*/".indexOf(c) != -1) { 
                    node.right = stack.pop();
                    node.left = stack.pop();
                }
            }
            stack.push(node);
        }

        if (stack.size() != 1) {
            throw new RuntimeException("Expected exactly one stack value.");
        }
        return stack.pop();
    }

    @Override
    public String toString() {
        return left == null ? String.valueOf(value) : 
             ("(" + left + " " + value + " " + right + ")");
    }
}
公共类节点{
字符值;
左、右淋巴结;
公共节点(字符值){
这个值=值;
}
公共静态节点parseUpn(字符串s){
堆栈=新堆栈();
for(char c:s.toCharArray()){
如果(c!=''){
节点=新节点(c);
如果(“+-*/”.indexOf(c)!=-1){
node.right=stack.pop();
node.left=stack.pop();
}
}
栈推(节点);
}
if(stack.size()!=1){
抛出新的RuntimeException(“只需要一个堆栈值”);
}
返回stack.pop();
}
@凌驾
公共字符串toString(){
返回left==null?字符串。valueOf(值):
((“+左+”+值+“+右+”);
}
}

您能为您的问题添加更多细节吗?例如,哪个是样本输入的期望输出。你需要Java中的通用算法还是通用实现(我看到你添加了一个标记)?Java中的通用实现请停止称它为RPN;它甚至不是那种风格的专有名称,而且它的长度太长了。请叫它“后缀”。此外,括号是愚蠢的。一旦你摸索了后缀,它实际上比通常的括号更容易理解。为了鼓励学习,你应该知道,我拥有我答案中所有代码的版权。(它是根据a发布的。)如果你把我写的任何代码按原样交给你的编程类,那么你就违反了版权法,除非你表明是我写的。现在,如果你真的理解了我上面给出的代码,那么制作遍历树并构建插入表达式的部分应该非常容易。请参阅。您已经授予了SO永久许可证,OP有权根据相同条款下载供个人使用。@EJP是的,我知道这一点。实际上我只是查了一下,看看有什么许可要求。我是说,如果他把它用于他的课堂作业,他必须把我的名字写在上面。重点不是限制使用,而是确保他不只是复制粘贴代码。(无论如何,我打算在几天后完全发布它)关于多字符操作,如
***
(用于求幂)或具有两个子项以上的操作(一个
if?then:else
操作需要三个子项)对不起,我忽略了示例中的一些内容了吗?你怎么知道“**”不是2x乘法?IIRC在Forth中,它们由空格分隔,因此在这种情况下,可以使用String.split()。。。但是这个例子只有当ac被当作两个独立的变量时才有意义……真的!实际上,如果您使用“`*进行乘法运算,就不能使用
**
作为幂运算!尽管如此,它仍然可以应用于其他情况。例如,在PostScript中,运算符是
add
sub
mul
等,而不是单个字符,三元运算符仍然保留。代码也不处理一元运算符。。。但在没有更多信息的情况下解决这部分问题只是猜测。。。
public static Node<Token> makeTree(Token [] tokens){
    Stack<Node<Token>> stack = new Stack<>();

    try{
        for(Token t:tokens){
            Node<Token> node = new TreeNode<Token>(t);
            for(int idx = 0; idx < t.getOperandCount(); idx++)
                node.addChild(stack.pop());
            stack.push(node);
        }
    }catch (EmptyStackException e){
        throw new MalformedExpressionException("too few operands");
    }

    if(stack.size() != 1)
        throw new MalformedExpressionException("too many operands");

    return stack.pop();
}
public class Node {
    char value;
    Node left, right;

    public Node(char value) {
        this.value = value;
    }

    public static Node parseUpn(String s) {
        Stack<Node> stack = new Stack<Node>();

        for (char c: s.toCharArray()) {
            if (c != ' ') {
                Node node = new Node(c);
                if ("+-*/".indexOf(c) != -1) { 
                    node.right = stack.pop();
                    node.left = stack.pop();
                }
            }
            stack.push(node);
        }

        if (stack.size() != 1) {
            throw new RuntimeException("Expected exactly one stack value.");
        }
        return stack.pop();
    }

    @Override
    public String toString() {
        return left == null ? String.valueOf(value) : 
             ("(" + left + " " + value + " " + right + ")");
    }
}