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;   //最终集合就为 后缀表达式        }

 

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