JAVA數據結構 - 中綴表達式轉換爲後綴表達式

1.首先將中綴字符串放入集合列如:  (3+20)*(3-10)     - ->      [(, 3, +, 20, ), *, 3, -, 10]

    1.數字的ascll碼爲 48-57 如果是運算符或括號直接加入集合 

    2.在不越界和是數字的情況下, 一直循環拼接多位數 爲字符串 str 

public List<String> InfixStrToInfixList(String expression) {
        List<String> arrayList = new ArrayList<>();
        int index = 0;   //索引
        String str;   //拼接多位數
        do {
            //如果是非數字,加入集合
            if (expression.charAt(index) < 48 || expression.charAt(index) > 57) {
                arrayList.add(expression.charAt(index) + "");
                index++;
            } else {   //是一個數, 需要考慮多位數
                str = "";   //拼接前 先將str置空
                //沒有越界,並且是數字就一直拼接
                while (index < expression.length() && expression.charAt(index) >= 48 && expression.charAt(index) <= 57) {
                    str += expression.charAt(index);
                    index++;
                }
                arrayList.add(str);  //str 拼接完成

            }

        } while (index < expression.length());
            return arrayList;            }

2.中綴表達式集合轉換爲 後綴表達式集合  [(, 3, +, 20, ), *, 3, -, 10] -> [3, 20, +, 3, 10, -, *]

   1.定義棧 operatorStack   存放符號         2.定義集合 numbersList   存放數據及最終 轉換完成的 表達式

   3.遍歷 中綴表達式   如果item數字直接加入數據集合   如果是  "("     直接加入符號棧

   4.如果item是 " ) "     就循環彈出 符號棧棧頂 加入數據集合 ,直到遇到 "("    ,

                       循環完成    彈出符號棧的 "("   ,相當於將( ) 中間的符號和數字加入數據集合   並消除 ( )

   5.如果是item 是運算符,分兩種情況:       

       1. item 優先級 小於等於  符號棧 棧頂的優先級, 就將  符號棧彈出加入數據集合 ,一直循環直到item 優先級大於棧頂,

          再將item入符號棧

       2. item 優先級 大於 符號棧 棧頂的優先級,直接入符號棧

 6.最後將剩餘在符號棧的符號依次彈出 加入到數據集合,   集合順序輸出就爲後綴表達式

     public List<String> infixListToSuffixList(List<String> InfixList) {
        Stack<String> operatorStack = new Stack<>();   存放符號棧
        List<String> numbersList = new ArrayList<>();  存放數據集合
        for (String item : InfixList) {
            if (item.matches("\\d+")) {   //是數字,直接入數據集合
                numbersList.add(item);
            } else if (item.equals("(")) {      //是左括號,直接入符號棧
                operatorStack.push(item);
            } else if (item.equals(")")) {   //是右括號,彈出符號棧到數據集合,直到遇到左括號

                while (!operatorStack.peek().equals("(")) {  //直到遇到左括號
                    numbersList.add(operatorStack.pop());  //彈出符號棧到數據集合
                }
                operatorStack.pop();   //彈出 "(" ,就是消除括號
            } else {   //是運算符
                 * 當 item 優先級小於等於 operatorStack棧頂優先級,
                 * 將符號棧彈出一個加入數據集合,再將item與operatorStack下一個運算符比較,直到item大於它
                while (operatorStack.size() != 0
                        && OperatorGrade(item) <= OperatorGrade(operatorStack.peek())) {
                    numbersList.add(operatorStack.pop());
                }
                operatorStack.push(item); //最後還要將 item 加入符號棧

            }
        }

        while (operatorStack.size()!=0){    //將剩餘在 符號棧中的 符號加入數據集合
            numbersList.add(operatorStack.pop());
        }
        return numbersList;   //最終集合就爲 後綴表達式        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章