數據結構之中序遍歷轉興許遍歷(JAVA實現)(二)
阿新 • • 發佈:2017-06-30
百度 empty 表達 pty 中序 tor opera lin sem
執行效果:
算法流程:
主要分為四步:
1.當前字符為數字或者字母,則直接輸出
2.當前字符為)。則在棧中匹配輸出。一直匹配到),則停止輸出(就是將)及其頂上的元素所有彈出來輸出)
3.當前字符為操作符。則比較當前字符的入棧優先級(icp)和字符棧內優先級(isp)。假設icp<=isp,則將棧內操作符彈出輸出,然後反復3
4.當前字符為空,則將棧中元素依次彈出輸出
百度百科上面的描寫敘述:
1、建立運算符棧stackOperator用於運算符的存儲。壓入‘\0‘。
2、預處理表達式,正、負號前加0(假設一個加號(減號)出如今最前面或左括號後面,則該加號(減號)為正負號) 。
3、順序掃描表達式。假設當前字符是數字(優先級為0的符號),則直接輸出該數字。假設當前字符為運算符或括號(優先級不為0的符號)。則推斷第4點 。
4、若當前運算符為‘(‘,直接入棧;若為‘)‘,出棧並順序輸出運算符直到遇到第一個‘(‘。遇到的第一個‘(‘出棧但不輸出;若為四則運算符,比較棧頂元素與當前元素的優先級:假設 棧頂元素運算符優先級 >= 當前元素的優先級,出棧並順序輸出運算符直到 棧頂元素優先級 < 當前元素優先級。然後當前元素入棧;假設 棧頂元素 < 當前元素,直接入棧。
5、反復第3點直到表達式掃描完成。
6、順序出棧並輸出運算符直到棧頂元素為‘\0‘。
當然我自己理解的就是依照自己實現的簡單變化,沒有包含大括號
我的代碼:
// 中序遍歷改為興許遍歷 public String tranform(String obj) { Stack<Character> stack = new Stack<Character>(); String obj2 = ""; for (int i = 0; i < obj.length(); i++) { char ch = obj.charAt(i); if (Character.isLetter(ch))// 字母或數字直接輸出 { obj2 += ch; System.out.println(ch); } else if (ch == ')')// 在棧中一致匹配到)操作符才停止出棧 { char temp; while ((temp = stack.pop()) != '(') { obj2 += temp; System.out.println(temp); } } else // 比較操作符的進棧優先級 { if(stack.isEmpty()) { stack.push(ch); continue; } char temp = stack.peek(); while (icp(ch) <= isp(temp))//進棧優先級小於棧內優先級,則一直出棧 { System.out.println(temp); obj2+=temp; stack.pop(); if(stack.isEmpty())break; temp=stack.peek(); } stack.push(ch); } } //將棧中剩余的元素彈出來 while(!stack.isEmpty()) { char temp=stack.pop(); obj2+=temp; System.out.println(temp); } return obj2; } // 操作符在棧內的優先級 private int isp(char ch) { switch (ch) { case '+': case '-': return 2; case '*': case '/': return 4; case ')': return 7; case '(': return 1; default: break; } return 0; } // 操作符進棧的優先級優先級 private static int icp(char ch) { switch (ch) { case '+': case '-': return 3; case '*': case '/': return 5; case ')': return 1; case '(': return 7; default: break; } return 0; } public static void main(String[] args) { String objString="a*(b+c)+c/d"; TreeNode<Character> treeNode=new TreeNode<Character>(null); treeNode.tranform(objString); }
a*(b+c)+c/d -》 abc+*cd/*
假設利用這個後序遍歷非常easy實現一個簡單的計算器,除此之外,我記得一個基於文法的計算器,等下一次實現。
數據結構之中序遍歷轉興許遍歷(JAVA實現)(二)