中缀表达式转后缀表达式详解

Posted mx_info

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式转后缀表达式详解相关的知识,希望对你有一定的参考价值。

中缀表达式转后缀表达式详解

思路分析

  1. 中缀表达式即支持运算的表达式,而方法计算式计算的则是后缀表达式,因此有必要将中缀表达式转换为后缀表达式
  2. 先将中缀表达式的各项拆分,然后存储到集合中,因为集合方便存和取以及遍历的特点
  3. 然后遍历集合中各元素,按照指定的规则,将各元素转换为后缀表达式
  4. 详解见下源码

源码及分析

将中缀表达式存储到集合中
//编写方法将一个中缀表达式存储到集合中
    public static List<String> infixExpressionToList(String infixExp) {
        //定义ArrayList保存中缀表达式的各元素
        ArrayList<String> list = new ArrayList<>();
        //定义变量
        //定义扫描字符串的指针
        int i = 0;
        //定义字符串str用来拼接数字
        String str = "";
        //定义 c 表示当前扫描到的字符
        char c;
        //循环扫描字符串
        do {
            //如果当前扫描到的字符是一个非数字,即是一个运算符,则直接添加到List中
            if ((c = infixExp.charAt(i)) < 48 || (c = infixExp.charAt(i)) > 57) {
                list.add(c + "");
                i++;
            } else {
                //否则扫描到的就是一个数字,需要考虑多位数的情况
                //先将str置空
                str = "";
                //循环判断当前数字的下一位是否任然是数字,如果是,则拼接,否则结束循环
                while (i < infixExp.length() && (c = infixExp.charAt(i)) >= 48 && (c = infixExp.charAt(i)) <= 57) {
                    str += infixExp.charAt(i);
                    i++;
                }
                list.add(str);
            }
        } while (i < infixExp.length());
        return list;
    }

将中缀表达式转换为后缀表达式
//编写方法将中缀表达式转换为后缀表达式,方便计算机的计算
    //已将中缀表达式个元素存储到集合中,则只需要转换为后缀表达式存储到集合即可
    /**
     *
     * @param ls 中缀表达式所在集合
     * @return    返回后缀表达式
     */
    public static List<String> infixParseSufixList(List<String> ls){
        //定义一个栈用来辅助转换,基于栈的先进后出特性
        Stack<String> stack = new Stack<>();
        //定义集合保存转换后的后缀表达式
        List<String> list = new ArrayList<>();
        //遍历中缀表达式的所有元素,按照指定规则将其加入到集合中
        for (String item : ls) {
            //使用正则判断取出来的元素,如果取出来的是数字,则直接加入到集合
            if (item.matches("\\\\d+")){
                list.add(item);
                //如果是左括号,则直接入栈
            }else if (item.equals("(")){
                stack.push(item);
                //如果是右括号,则弹出栈中左括号之前的元素,因为考虑到小括号的优先级比其他运算符高
            }else if (item.equals(")")){
                while (!stack.peek().equals("(")){
                    list.add(stack.pop());
                }
                //最后再弹出左括号
                stack.pop();
                //否则是其他运算符的话就要比较运算符的优先级
            }else {
                //将高运算符先加入集合,因为要先进行计算
                while (stack.size() != 0 && Operation.getOperation(stack.peek()) >= Operation.getOperation(item)){
                    list.add(stack.pop());
                }
                //如果是优先级较低的运算符,则直接入栈
                stack.push(item);
            }
        }
        //最后将栈中所有的运算符全部出栈加入到集合中
        while (!stack.isEmpty()){
            list.add(stack.pop());
        }
        return list;
    }
比较运算符优先级
//编写一个类,返回运算符对应的优先级
@SuppressWarnings("all")
class Operation{
    private static int ADD = 1;
    private static int SUB = 1;
    private static int MUL = 2;
    private static int DIV = 2;
    //编写方法返回运算符的优先级
    public static int getOperation(String operation){
        int res = 0;
        switch (operation){
            case "+":
                res = ADD;
                break;
            case "-":
                res = SUB;
                break;
            case "*":
                res = MUL;
                break;
            case "/":
                res = DIV;
                break;
            default:
                //System.out.println("运算符有误...");
                break;
        }
        return res;
    }
}

以上是关于中缀表达式转后缀表达式详解的主要内容,如果未能解决你的问题,请参考以下文章

中缀表达式转后缀表达式(Java代码实现)

数据结构中缀表达式转后缀表达式以及后缀转中缀表达式

[Code] 中缀式转后缀式

中缀表达式转后缀表达式 (栈)

中缀表达式如何转换为前后缀表达式?

java实现中缀表达式转后缀表达式