import java.util.Stack;
public class Main {
    public  Double Evaluate(String str) {
        Stack sk1 = new Stack();
        Stack sk2 = new Stack();

        for(int i = 0;i< str.length();i++) {

            String temp = str.charAt(i)+"";

            if(temp.equals("*")) sk1.push(temp);
            //不要加东西进去 不然会计算后数据出错
            else if(temp.equals("("))               ;
            else if(temp.equals("-")) sk1.push(temp);
            else if(temp.equals("+")) sk1.push(temp);
            else if(temp.equals("/")) sk1.push(temp);
            else if(temp.equals(")")) {
                String x = sk1.pop();
                double y = sk2.pop();
                if(x.equals("+")) sk2.push(y + sk2.pop());
                else if(x.equals("-"))  sk2.push(y - sk2.pop());
                else if(x.equals("*"))  sk2.push(y * sk2.pop());
                else if(x.equals("/"))  sk2.push(sk2.pop() / y);
            }
            else 
            {
                sk2.push(Double.parseDouble(temp));
            }
        }
        return sk2.peek();
    }

    public static void main(String[] args) {
        Main m = new Main();
        String str ="(((1+2)*6)+4)";
        System.out.println(m.Evaluate(str));
    }
}

另外一种是采用递归的方式

package leetcode;

import java.util.Scanner;

public class Main {
    private static int i = 0;
//递归的方式:如(2+2)*(1+2)+9/2 分解为(2+2)这个表达式 (1+2)这个表达式 + 9/2这个表达式
    //然后每个表达式进行递归取值 然后把所有的值加起来 
    private static int expression_value(String str) {
        //result 的作用是将表达式的第一个因子求出来
        //因为i++ 随着递归不断增加 所以判断后面是什么符号 所以一开始在运算式后面再家一个空格的作用就在这里
        int result = term_value(str);
        while (true) {
            //后面如果是加号的话进行加减 不考虑乘除
            char temp = str.charAt(i) ;
            if (temp == '+' || temp == '-') {
                i++;
            //通过term_value 这个方法求解第二个因子
                int value = term_value(str);
                if (temp == '+')
                    result += value;
                else
                    result -= value;
            }
            else
                break;
        }
        return result;
    }
//求解因子的方法
    private static int term_value(String str) {
//调用了一个factor 这个方法 所有加减都要优先考虑乘除 更要先考虑括号
        int result = factor_value(str);
        while (true) {
            char temp = str.charAt(i);
            if (temp == '*' || temp == '/' ) {
                i++;
                //继续调用factor方法去后面的值是否右有括号 除掉括号进行乘除
                int value = factor_value(str);
                if (temp =='*')
                    result *= value;
                else
                    result /= value;
            } else
                break;
        }
        return result;
    }

    private static int factor_value(String str) {
        //进行括号内的运算
        int result = 0;
        char temp = str.charAt(i);
        if (temp == '(') {
            i++;
            result = expression_value(str);
            i++;
        }
        else {
            while ( (temp - '0') >= 0 && (temp - '0') <= 9) {
                result = 10 * result + temp - '0';
                i++;
                temp = str.charAt(i);
            }
        }
        return result;
    }
//总结三个方法
    //expression_value 方法是进行加减
    //trem_value方法是进行乘除
    //factor_value 方法是进行去括号 括号内又有表达式 表达式又有加减乘除 括号 所有继续调用
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in);
        String s = sc.next()+" ";
        System.out.println(expression_value(s));
    }
    }