使用Java中的树

时间:2017-10-16 10:30:16

标签: java data-structures stack expression-trees

我应该使用表达式树来评估后缀表达式。 编译程序时出错

  

"方法getElement()未定义ExpressionTree.Node类型"

getElement对堆栈类不起作用吗? 如果不是我应该用什么来获取堆栈中的元素?

import java.util.Stack;
public class ExpressionTree 
{
    Node root;

    // Node sub-class
    public class Node 
    {
        private String key; // key
        private Node left; // links to subtrees
        private Node right;

        public Node(String key)
        {
            this.key = key;
        }
    }

    // constructor to build a tree with postFix expression
    public ExpressionTree(String postFixExpression)
    {
        Stack<Node> stack = new Stack<Node>();
        String[] tokens = postFixExpression.split(" ");
        for (String token: tokens) 
        {
            if (isOperator(token))
            {
                Node right = stack.pop();
                Node left = stack.pop();
                Node node = new Node(token);
                node.left = left;
                node.right = right;
                stack.push(node);
            }
            else
            {
                stack.push(new Node(token));
            }
        }
        root = stack.pop();
    }

    private boolean isOperator(String token)
    {
        boolean result = false;
        switch(token) 
        {
            case "+":
            case "-":
            case "*":
            case "/":
                result = true;
                break;
            default:
                result = false;
        }
        return result;
    }

    /**
     * @return result of the expression
     * @throws Exception
     */
    public double evaluate() throws Exception
    {
        if (root==null)
            result = 0;
        else
        {
            temp = (ExpressionTreeOp)root.getElement();

            if (temp.isOperator())
            {
                operand1 = evaluateNode(root.getLeft());
                operand2 = evaluateNode(root.getRight());
                if (operator == '+')
            result = operand1 + operand2;

        else if (operator == '-')
            result = operand1 - operand2;
        else if (operator == '*')
            result = operand1 * operand2;
        else 
            result = operand1 / operand2;
            }
            else
                result = temp.getValue();
        }

        return result;

    }

}

2 个答案:

答案 0 :(得分:1)

root.getElement();

root这是类Node的对象。发生编译错误,因为此类没有名为getElement的方法:

// Node sub-class
public class Node 
{
    private String key; // key
    private Node left; // links to subtrees
    private Node right;

    public Node(String key)
    {
        this.key = key;
    }
}
  

getElement对堆栈类不起作用吗?

示例代码中没有stack类。为了说清楚,Java不会自动创建方法,您需要从某个现有类继承方法或自己实现它。

  

如果不是我应该使用什么来获取堆栈中的元素?

我想你必须自己实施这个方法。

Node getElement() {
    //something
}

或者在某处使用实际的Stack实现。此接口提供peekpop方法来访问堆栈的head元素。

答案 1 :(得分:1)

java

中的Stack或Vector类中没有getElement()方法

Stack.java类的方法

push
pop
peek
empty
search

Vector.java类的方法

add
addAll
get
elementAt
firstElement
lastElement
setElementAt
removeElementAt
...........