標籤:efault line 文法 字元 public size 不為 運算 計算機
演算法流程:
主要分為四步:
1.當前字元為數字或者字母,則直接輸出
2.當前字元為)。則在棧中匹配輸出。一直匹配到),則停止輸出(就是將)及其頂上的元素所有彈出來輸出)
3.當前字元為操作符。則比較當前字元的入棧優先順序(icp)和字元棧內優先順序(isp)。假設icp<=isp,則將棧內操作符彈出輸出,然後反覆3
4.當前字元為空白,則將棧中元素依次彈出輸出
百度百科上面的描寫敘述:
1、建立運算子棧stackOperator用於運算子的儲存。壓入‘\0‘。
2、預先處理運算式,正、負號前加0(假設一個加號(減號)出如今最前面或左括弧後面,則該加號(減號)為加號或減號) 。
3、順序掃描運算式。假設當前字元是數字(優先順序為0的符號),則直接輸出該數字。假設當前字元為運算子或括弧(優先順序不為0的符號)。則推斷第4點 。
4、若當前運算子為‘(‘,直接入棧;若為‘)‘,出棧並順序輸出運算子直到遇到第一個‘(‘。遇到的第一個‘(‘出棧但不輸出;若為四則運算子,比較棧頂元素與當前元素的優先順序:假設 棧頂元素運算子優先順序 >= 當前元素的優先順序,出棧並順序輸出運算子直到 棧頂元素優先順序 < 當前元素優先順序。然後當前元素入棧;假設 棧頂元素 < 當前元素,直接入棧。
5、反覆第3點直到運算式掃描完成。
6、順序出棧並輸出運算子直到棧頂元素為‘\0‘。
當然我自己理解的就是依照自己實現的簡單變化,沒有包含大括弧
My Code:
// 中序遍曆改為興許遍曆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實現)(二)