java计算器༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽,又是掉发的一天

题目:

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。


示例 1:

输入:s = "1 + 1"
输出:2
示例 2:

输入:s = " 2-1 + 2 "
输出:3
示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23


提示:

1 <= s.length <= 3* 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
'+' 不能用作一元运算(例如, "+1"和 "+(2 + 3)"无效)
'-' 可以用作一元运算(即 "-1"和 "-(2 + 3)"是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数

 

代码:

public int calculate(String s) {
        int a =0;
        s=s.replace(" ","");//去除空格的一个方法
        List<String> a1 =new ArrayList<>();
        //把整体分为小部分存入集合
        String a2 ="";
        for (int i = 0; i <s.length() ; i++) {
            switch (s.charAt(i)){
                case '1':
                    a2+="1";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '2':
                    a2+="2";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '3':
                    a2+="3";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '4':
                    a2+="4";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '5':
                    a2+="5";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '6':
                    a2+="6";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '7':
                    a2+="7";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '8':
                    a2+="8";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '9':
                    a2+="9";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '0':
                    a2+="0";
                    if (i==s.length()-1)
                        a1.add(a2);
                    break;
                case '+':
                    if (s.charAt(i-1)==')'){
                        a1.add("+");
                    }else {
                        a1.add(a2);
                        a2="";
                        a1.add("+");
                    }
                    break;
                case '-':
                    if (i==0||s.charAt(i-1)==')'||s.charAt(i-1)=='('){
                        a1.add("-");
                    }else {
                        a1.add(a2);
                        a2="";
                        a1.add("-");
                    }
                    break;
                case '*':
                    if (s.charAt(i-1)==')'){
                        a1.add("*");
                    }else {
                        a1.add(a2);
                        a2="";
                        a1.add("*");
                    }
                    break;
                case '/':
                    if (s.charAt(i-1)==')'){
                        a1.add("/");
                    }else {
                        a1.add(a2);
                        a2="";
                        a1.add("/");
                    }
                    break;
                case '(':
                    a++;
                    a1.add("(");
                    break;
                case ')':
                    if (s.charAt(i-1)==')'){
                        a1.add(")");
                    }else {
                    a1.add(a2);
                    a2="";
                    a1.add(")");}
                    break;

            }
        }
        //把括号里面的东西先计算出来
        for (int i = 0; i <a ; i++) {
            int b =0;//右括号下标
            int b1=0;//左括号下标
            //找第一个右括号
            q:for (int j = 0; j <a1.size() ; j++) {
                switch (a1.get(j)){
                    case ")":
                        b=j;
                        break q;
                }
            }
            //找与之对应的左括号
            o:for (int j = b-2; j >=0 ; j--) {//第一个右括号对应的左括号
                switch (a1.get(j)){
                    case "(":
                        b1=j;
                        break o;
                }
            }
            //把括号之间的字符串值赋给字符串数组a4
            String[] a4=new String[b-b1];
            for (int j = b1+1; j <b ; j++) {
                a4[j-b1-1]=a1.get(j);
            }
            //集合中删除到只剩一个又括号
            for (int j = b1; j <b ; j++) {
                a1.remove(b1);
            }
            //
            a1.set(b1,jisuan(a4));
        }
        switch (a1.size()){
            case 2:
                return 0-Integer.valueOf(a1.get(1));
        }
        String[] a5=new String[a1.size()];
        for (int i = 0; i <a1.size() ; i++) {
            a5[i]=a1.get(i);
        }
        return Integer.valueOf(jisuan(a5));
    }

    public String jisuan(String[] a){
        double s=0;
        if (a.length==1){
            return  String.valueOf(a[0]);
        }
        for (int i = 0; i <a.length-1 ; i++) {
            switch (a[i]){
                case "+":
                    s+=Double.valueOf(a[i+1]);
                    i++;
                    break;
                case "-":
                    s-=Double.valueOf(a[i+1]);
                    i++;
                    break;
                case "*":
                    s*=Double.valueOf(a[i+1]);
                    i++;
                    break;
                case "/":
                    s/=Double.valueOf(a[i+1]);
                    i++;
                    break;
                default:
                    s+=Double.valueOf(a[i]);
            }
        }
        return  String.valueOf((int)s);
    }

 

 

思路:

………………我有思路嘛,我感觉我就是一步一步强行拆分出来的,先判断有没有括号,有的话先把括号里面的算出来,然后代替了括号括号里面的这些个字符串(也包括,括号),最后得到一个没有括号的字符串,然后如果存在负数,然后用0去一个一个加就好了

posted @ 2022-09-19 16:16  牛杂刻师傅  阅读(87)  评论(0)    收藏  举报