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

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
中缀表达式是我们常见的数学表达式的一种表示方法,例如"3 + 4 * 2 - 5"。但是在计算机中,中缀表达式并不方便进行计算,因此我们需要将其转换后缀表达式(逆波兰表达式)来求值。 我们可以使用栈来处理中缀表达式的求值。具体的方法如下: 1. 创建一个空栈和一个空列表来存储中间和最终结果。 2. 遍历中缀表达式中的每一个字符。 3. 如果遇到操作数(数字),直接将其添加到列表中。 4. 如果遇到运算符,分以下几种情况处理: - 如果栈为空,或者栈顶为左括号,则直接将运算符入栈。 - 如果栈顶为运算符,并且栈顶运算符的优先级大于当前运算符,则将栈顶运算符出栈,并加入到列表中,然后继续比较当前运算符与新的栈顶运算符的优先级。 - 最后将当前运算符入栈。 5. 如果遇到左括号,直接将其入栈。 6. 如果遇到右括号,则将栈中的运算符依次出栈,加入到列表中,直到遇到左括号为止。 7. 遍历完中缀表达式后,将栈中剩余的运算符依次出栈,加入到列表中。 8. 最后,遍历列表中的元素进行计算。如果遇到操作数,直接入栈;如果遇到运算符,从栈中弹出两个操作数,并进行相应的运算,然后将运算结果重新入栈。 9. 最终,栈中只剩下一个数,即为中缀表达式的求值结果。 通过上述方法,我们可以实现对中缀表达式的求值,而且时间复杂度为O(n),其中n为表达式的长度。这种方法利用了栈的特性,在处理运算符时将其按照优先级依次出栈,确保了运算的正确顺序,并得到了最终的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值