資料結構之中序遍曆轉興許遍曆(JAVA實現)(二)

來源:互聯網
上載者:User

標籤: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實現)(二)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.