码迷,mamicode.com
首页 > 编程语言 > 详细

Java实现后缀表达式建立表达式树

时间:2019-01-02 10:48:06      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:ring   lse   string   节点   view   closed   class   inf   his   

概述

表达式树的特点:叶节点是操作数,其他节点为操作符。
由于一般的操作符都是二元的,所以表达式树一般都是二叉树。


根据后缀表达式"ab+cde+**"建立一颗树

文字描述:

如同后缀表达式求值一样,逐个读取后缀表达式的每一个符号,
如果遇到操作数,建立一个节点把操作数的值加入这个节点,并把节点入栈;
如果遇到操作符,弹出栈里的两个节点,并赋值为自己的左子节点、右子节点,最后把这个节点树入栈。

画图描述

1、读入操作数a,创建节点,压入栈;读入操作数b,创建节点,压入栈

      技术分享图片

2、遇到操作符“+”,弹出栈内的两个节点;创建一个新节点;把“+”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈

技术分享图片

3、读入操作数c,创建节点,压入栈……

技术分享图片

4、遇到操作符“+”,弹出栈内的两个节点;创建一个新节点;把“+”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈(和第2步相同)

技术分享图片

5、遇到操作符“*”,弹出栈内的两个节点;创建一个新节点;把“*”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈(和第2步相同)

技术分享图片

6、好了

技术分享图片

代码实现

技术分享图片
import java.util.Stack;

public class Test {
    // 前缀表达式 +ab**+cde
    // 中缀表达式 (a+b)*((c+d)*e)
    // 后缀表达式
    static String expression = "ab+cde+**";
    static Stack stack = new Stack();
    public static void main(String[] args) {
        Tree tree = createTree(expression);
        // 后序遍历输出树
        travTree(tree.root);
    }
    private static void travTree(Node node) {
        Node currentNode = node;
        if (currentNode != null) {
            travTree(currentNode.leftChild);
            travTree(currentNode.rightChild);
            System.out.print(node.element);
        }
    }
    // 把后缀表达式转化为一颗树
    private static Tree createTree(String expression) {
        for (int i = 0; i < expression.length(); i++) {
            char ch = expression.charAt(i);
            if (ch != ‘+‘ && ch != ‘-‘ && ch != ‘*‘ && ch != ‘/‘) {
                Node node = new Node(ch);
                stack.push(node);
            } else {
                Node node = new Node(ch);
                Node rightNode = (Node)stack.pop();
                Node leftNode = (Node)stack.pop();
                node.setLeftChild(leftNode);
                node.setRightChild(rightNode);
                stack.push(node);
            }
        }
        return new Tree((Node) stack.pop());
    }
}
class Node {
    char element;
    Node leftChild;
    Node rightChild;
    Node(char element) {
        this.element = element;
    }
    void setLeftChild(Node leftChild) { this.leftChild = leftChild; }
    void setRightChild(Node rightChild) { this.rightChild = rightChild; }
}
class Tree {
    Node root;
    Tree(Node root) { this.root = root;}
}
View Code

 

Java实现后缀表达式建立表达式树

标签:ring   lse   string   节点   view   closed   class   inf   his   

原文地址:https://www.cnblogs.com/Mike_Chang/p/10206757.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!