1. 程式人生 > >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