1. 程式人生 > >【java】表示式樹

【java】表示式樹

根據數學表示式建立表示式樹

對於數學表示式a+b*(c-d)-e/f,可以表示成如下圖所示的二叉樹,


要建立二叉表示式樹,方法有很多,下面介紹一種:找到最後計算的運算子,然後遞迴處理。

對於最後計算的運算子,+ -號在* /號之後計算,而對於相同優先順序的運算子(+和-,*和/),我們規定最右出現的後計算(也可按其他順序設計程式)。

輸入數學表示式,然後輸出字尾表示式。

樣例輸入:

a+b*(c-d)-e/f

樣例輸出:

abcd-*+ef/-

import java.util.Scanner;

class Node{
	char val;
	Node left;
	Node right;
	public Node(char val){
		this.val=val;
	}
}
public class Main {
	public static Node buildTree(String str){
		Node node=null;
		if(str.length()==1){
			node=new Node(str.charAt(0));
			return node;
		}
		int p=0,c1=-1,c2=-1;			//p,c1,c2分別存放未匹配的括號數量,最右出現的+-號下標,最右出現的*/號下標
		for(int i=0;i<str.length();i++){
			switch(str.charAt(i)){
			case '(': 
				p++;
				break;
			case ')': 
				p--;
				break;
			case '+': case'-': 
				if(p==0) 
					c1=i;
				break;
			case '*': case'/':
				if(p==0)
					c2=i;
				break;
			}
		}
		if(c1<0&&c2<0)			//整個表示式是被一對括號括起來的
			node=buildTree(str.substring(1, str.length()-1));
		else if(c1>0){
			node=new Node(str.charAt(c1));
			node.left=buildTree(str.substring(0,c1));
			node.right=buildTree(str.substring(c1+1,str.length()));
		}else{
			node=new Node(str.charAt(c2));
			node.left=buildTree(str.substring(0,c2));
			node.right=buildTree(str.substring(c2+1,str.length()));
		}
		return node;
	}
	public static void postOrder(Node node){
		if(node==null)
			return;
		postOrder(node.left);
		postOrder(node.right);
		System.out.print(node.val);
	}
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			String str=scanner.nextLine();
			Node root=buildTree(str);
			postOrder(root);
			System.out.println();
		}
		scanner.close();
	}
}


根據字尾表示式建立表示式樹

輸入字尾表示式,然後輸出字首表示式和中綴表示式。

樣例輸入:

abcd-*+ef/-

樣例輸出:

-+a*b-cd/ef
a+b*c-d-e/f

import java.util.Scanner;
import java.util.Stack;

class Node{
	char val;
	Node left;
	Node right;
	public Node(char val){
		this.val=val;
	}
}
public class Main {
	public static Node buildTree(String str){
		Stack<Node> stack=new Stack<Node>();
		for(char c:str.toCharArray()){
			if(c=='+'||c=='-'||c=='*'||c=='/'){
				Node node=new Node(c);
				Node right=stack.pop();
				Node left=stack.pop();
				node.left=left;
				node.right=right;
				stack.push(node);
			}else{
				Node node=new Node(c);
				stack.push(node);
			}
		}
		Node root=stack.pop();
		return root;
	}
	public static void preOrder(Node node){
		if(node==null)
			return;
		System.out.print(node.val);
		preOrder(node.left);
		preOrder(node.right);
	}
	public static void inOrder(Node node){
		if(node==null)
			return;
		inOrder(node.left);
		System.out.print(node.val);
		inOrder(node.right);
	}
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			String str=scanner.nextLine();
			Node root=buildTree(str);
			preOrder(root);
			System.out.println();
			inOrder(root);
			System.out.println();
		}
		scanner.close();
	}
}