zoukankan      html  css  js  c++  java
  • Java实现后缀表达式建立表达式树

    概述

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


    根据后缀表达式"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 判断是否满足正则表达式
    bootstrap-select多选框与Vue整合,下拉的数据刷新不出
    Windows 修改host文件不起作用
    【服务器】【tomcat】Tomcat 应用目录重定向
    【Spring】Spring装配Bean的顺序
    【Maven】m2e以原型创建Maven Project再次失败
    【Maven】m2eclipse以maven-archetype-quickstart原型创建Maven Project失败的解决
    【Java SE】jar xvf "path"命令
    【Java SE】形参被初始化为实参的值的拷贝
    【Java SE】斐波那契数列
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10206757.html
Copyright © 2011-2022 走看看