计算器

public static void main(String[] args) {
    String sun = "3+2*-3*4-1";
    Stack<Character> stack = new Stack<>();
    Stack<Double> numbers = new Stack<>();
    List<Character> operator = Arrays.asList('+', '-', '*', '/');

    String str = "";
    for (int i = 0; i < sun.length(); i++) {
        char c = sun.charAt(i);
        if (operator.contains(c)) {
            if (c == '-' && str == "") {
                str += c;
                continue;
            } else if (!StringUtils.isEmpty(str)) {
                numbers.push(Double.parseDouble(str));
                str  = "";
            }

            // 当前操作符的优先级小于栈顶部的优先级,则需出栈计算
            if (!stack.isEmpty() && comparOperation(c) <= comparOperation(stack.peek())) {
                Character oper = stack.pop();
                double number1 = numbers.pop();
                double number2 = numbers.pop();
                double result = getResult(oper, number2, number1);
                numbers.push(result);
            }
            stack.push(c);
        }  else if ('(' == c) {
            stack.push(c);
        } else if (')' == (c)) {
            if (!StringUtils.isEmpty(str)) {
                numbers.push(Double.parseDouble(str));
                str  = "";
            }
            Character oper;
            while ((oper = stack.pop()) != '(' && !stack.empty()) {
                double number1 = numbers.pop();
                double number2 = numbers.pop();
                double result = getResult(oper, number2, number1);
                numbers.push(result);
            }
        } else {
            str += c;
        }
    }
    if (!StringUtils.isEmpty(str)) {
        numbers.push(Double.parseDouble(str));
    }
    // 栈后计算
    while (!stack.isEmpty()) {
        Character oper = stack.pop();
        double number1 = numbers.pop();
        double number2 = numbers.pop();
        double result = getResult(oper, number2, number1);
        numbers.push(result);
    }
    DecimalFormat decimalFormat = new DecimalFormat("#0");
    System.out.println(decimalFormat.format(numbers.pop()));
}
// 比较操作符优先级
private static int comparOperation(Character o1){
    if (o1 == '+' || o1 == '-') {
        return 0;
    } else if (o1 == '*' || o1 == '/'){
        return 1;
    } else {
        return -1;
    }
}

private static double getResult(Character oper, double num1, double num2) {
    if (oper == '+') {
        return num1 + num2;
    } else if (oper == '-') {
        return num1-num2;
    } else if (oper == '*') {
        return num1 * num2;
    } else if (oper == '/') {
        return num1 / num2;
    } else {
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值