【java】表示式樹
阿新 • • 發佈:2018-12-30
根據數學表示式建立表示式樹
對於數學表示式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(); } }