java计算符合四则运算的混合字符串

1.面试问题

在这里插入图片描述

2.思路

我的思路是,拿到字符串后,先去取最后一个’(’ 然后取最后一个 ‘(’ 后的 ‘)’,也就是拿到一个小括号表达式,然后我们对表达式进行四则运算,把计算结果替换()表达式。对于 [] 的处理方式也相同。直接贴最终实现代码了。

3.具体代码
public static void main(String[] args) {
        String str = "3*[(2+3)/(4+4)*5]*[(1+3)/2]";
        while(str.contains("[")) {
            while(str.contains("(")) {
                String b = str.substring(str.lastIndexOf('('));  //拿到表达式的最后一个  (
                int endnum = b.indexOf(')') + str.lastIndexOf('(');//拿到表达式的最后一个  (  后面的  )  就是形成一个()表达式,下标是str的下标
                String inner = str.substring(str.lastIndexOf('('),endnum+1);//截取()表达式的内容
                String r = inner.substring(1,inner.length()-1);//去掉()
//                String r = StringUtils.strip(inner,"()");//去掉  ()
                String v = String.valueOf(doCalculation(r));//计算四则运算
                String newv =  str.replace(inner,v);;//把结算结果替换()表达式
                str = newv;
            }
            String b = str.substring(str.lastIndexOf('['));//思路同 处理()
            int endnum = b.indexOf(']') + str.lastIndexOf('[');
            String inner = str.substring(str.lastIndexOf('['),endnum+1);
            String r = inner.substring(1,inner.length()-1);
            String v = String.valueOf(doCalculation(r));
            String newv =  str.replace(inner,v);;
            str = newv;
        }
        System.out.println(doCalculation(str));
    }

    private static double doCalculation(String formula) {
        ArrayList<Double> values = new ArrayList<Double>();
        ArrayList<String> operators = new ArrayList<String>();
        int curPos = 0;
        int prePos = 0;
        int minus = 0;
        for (char s : formula.toCharArray()) {
            if ((s == '+' || s == '-' || s == '*' || s == '/') && minus !=0 && minus !=2) {
                values.add(Double.parseDouble(formula.substring(prePos, curPos).trim()));
                operators.add("" + s);
                prePos = curPos + 1;
                minus = minus +1;
            }else{
                minus =1;
            }
            curPos++;
        }
        values.add(Double.parseDouble(formula.substring(prePos).trim()));
        char op;
        for (curPos = 0; curPos <= operators.size() - 1; curPos++) {
            op = operators.get(curPos).charAt(0);
            switch (op) {
                case '*':
                    values.add(curPos, values.get(curPos) * values.get(curPos + 1));
                    values.remove(curPos + 1);
                    values.remove(curPos + 1);
                    operators.remove(curPos);
                    curPos = -1;
                    break;
                case '/':
                    values.add(curPos, values.get(curPos) / values.get(curPos + 1));
                    values.remove(curPos + 1);
                    values.remove(curPos + 1);
                    operators.remove(curPos);
                    curPos = -1;
                    break;
            }
        }
        for (curPos = 0; curPos <= operators.size() - 1; curPos++) {
            op = operators.get(curPos).charAt(0);
            switch (op) {
                case '+':
                    values.add(curPos, values.get(curPos) + values.get(curPos + 1));
                    values.remove(curPos + 1);
                    values.remove(curPos + 1);
                    operators.remove(curPos);
                    curPos = -1;
                    break;
                case '-':
                    values.add(curPos, values.get(curPos) - values.get(curPos + 1));
                    values.remove(curPos + 1);
                    values.remove(curPos + 1);
                    operators.remove(curPos);
                    curPos = -1;
                    break;
            }
        }
        return values.get(0).doubleValue();
    }

4.计算结果

在这里插入图片描述

在这里插入图片描述

5.参考文章

java实现字符串四则运算公式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值