计算器模板

直接调用culcaltorMain()方法即可,传入String参数列如:“2*3+(1-2)*5/8”,其它的代码都注释了,就不多说了

public static int culcaltorMain(String s) {
        String trim = s.replaceAll(" ", "");
        List<String> s1 = stringToList(trim);
        if (!s1.contains("*")&&!s1.contains("-")&&!s1.contains("/")&&!s1.contains("+")){
            String s2 = trim.replaceAll("\\(", "");
            String s3 = s2.replaceAll("\\)", "");
            return Integer.parseInt(s3);
        }
        List<String> s2 = infixToSufix(s1);
        int n = calculator(s2);
        return n;
    }


    /**
     * 将String字符串转化为List集合
     *
     * @param s 需要转化的字符串
     * @return 转化后的list集合
     */
    public static List<String> stringToList(String s) {
        List<String> sList = new ArrayList<>();
        //循环判断每一个字符
        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(i);
            //如果是运算符直接加进去即可,i!=0的含义是第一个肯定是数字,如果第一个是操作符的话说明第一个数是负数
           if (judgeOperator(c + "")&&i==0?c=='-'?false:true:true) {
                sList.add(c + "");
            } else {
                //如果是数字的话,需要看看是不是多位数
                String num = s.charAt(i) + "";
                while (true) {
                    if (i + 1 < s.length() && !judgeOperator(s.charAt(i + 1) + "")) {
                        num += s.charAt(i + 1);
                        i++;
                    } else {
                        break;
                    }
                }
                sList.add(num);
            }
        }
        return sList;
    }


    /**
     * 判断是不是运算符或者括号
     *
     * @param s 需要判断的字符
     * @return 字符是否为
     */
    public static boolean judgeOperator(String s) {
        if (s.equals("*") || s.equals("/") || s.equals("+") || s.equals("-") || s.equals("(") || s.equals(")")) {
            return true;
        }
        return false;
    }


    /**
     * 将中缀表达式的集合 转化为 后缀表达式的集合
     *
     * @param list 需要转化的中缀表达式
     * @return 后缀表达式集合
     */
    public static List<String> infixToSufix(List<String> list) {
        Stack<String> numStack = new Stack<>();
        Stack<String> operatorStack = new Stack<>();

        /**
         * 将中缀表达式转化为后缀表达式
         * 1.判断是不是数字,如果是数字直接加入数字栈中
         * 2.如果不是数字,就是操作符
         * 3.若操作符栈为空,则直接将运算符加入到操作符栈中
         * 4.若是“)”,将操作符栈中的操作符依次取出,直到取出“(”为止
         * 5.若不是“(”,“)”,则判断当前操作符的优先级是否比操作符栈顶元素高,如果高则加入操作符栈中
         * 6.若操作符比操作符栈的栈顶元素的优先级低或相等,则取出操作符栈顶的操作符加入到数字栈中
         * 7.并将这个操作符加入到操作符栈
         */
        for (String s : list) {

            //如果是操作符的话
            if (judgeOperator(s)) {
                if (operatorStack.isEmpty()) {
                    operatorStack.add(s);
                } else if (s.equals("(")) {
                    operatorStack.add(s);
                } else if (s.equals(")")) {
                    while (!operatorStack.peek().equals("(")) {
                        numStack.add(operatorStack.pop());
                    }
                    operatorStack.pop();
                } else {
                    if (operatorPriority(s) > operatorPriority(operatorStack.peek())) {
                        operatorStack.add(s);
                    } else {
                        numStack.add(operatorStack.pop());
                        operatorStack.add(s);
                    }
                }
            } else {
                numStack.add(s);
            }
        }
        while (!operatorStack.isEmpty()) {
            numStack.add(operatorStack.pop());
        }
        return numStack;
    }

    /**
     * 判断操作符的优先级
     *
     * @param s 需要判断的操作符
     * @return 返回优先级
     */
    public static int operatorPriority(String s) {
        int priority;
        switch (s) {
            case "*":
            case "/":
                priority = 2;
                break;
            case "+":
            case "-":
                priority = 1;
                break;
            default:
                priority = 0;
        }
        return priority;
    }


    public static int calculator(List<String> list) {
        Stack<Integer> numStack = new Stack<>();
        for (String s : list) {
            if (judgeOperator(s)) {
                int calculate = calculate(numStack.pop(), numStack.pop(), s);
                numStack.add(calculate);
            } else {
                numStack.add(Integer.parseInt(s));
            }
        }
        return numStack.pop();
    }


    public static int calculate(int n1, int n2, String s) {
        int num = 0;
        switch (s) {
            case "*":
                num = n1 * n2;
                break;
            case "/":
                num = n2 / n1;
                break;
            case "+":
                num = n1 + n2;
                break;
            case "-":
                num = n2 - n1;
                break;
            default:
                num = 0;
        }
        return num;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值