Java 实现计算表达式(接受小数点)

Java 实现计算表达式

列入计算:2*(120/20+(40+20)*10-80+20-6)

思路:把数字和操作字符装入2个栈中,根据操作字符的优先级计算,最后数中留下计算结果。

public class CalculationUtils {

    private Stack<Character> chars;
    private Stack<Double> result;

    public Double calculation(String expression) {
        expression = expression == null ? "" : expression + "=";
        //校验 ()匹配
        Stack<Character> brackets = new Stack<>();
        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);
            if (!(isNumber(c)
                    || "+".equals(c + "")
                    || "-".equals(c + "")
                    || "*".equals(c + "")
                    || "/".equals(c + "")
                    || "=".equals(c + "")
                    || "(".equals(c + "")
                    || ")".equals(c + "")
                    || ".".equals(c + "")
            )) {
                //结束程序
                return (double) -1;
            }
            if ("(".equals(c + "")) {
                brackets.push(c);
            }
            if (")".equals(c + "")) {
                if (brackets.empty() || !"(".equals(brackets.pop() + "")) {
                    //结束程序
                    return (double) -1;
                }
            }
        }
        if (!brackets.isEmpty()) {
            //结束程序
            return (double) -1;
        }
        chars = new Stack<>();
        result = new Stack<>();
        //缓存多位操作数
        StringBuilder stringBuffer = new StringBuilder();
        // 计算
        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);
            if (isNumber(c)) {
                stringBuffer.append(c);
            } else {
                //加入数字
                if (!"".equals(stringBuffer.toString())) {
                    result.push(Double.parseDouble(stringBuffer.toString()));
                    stringBuffer = new StringBuilder();
                }
                // 栈顶有符号 且c的优先级小于等于栈顶的优先级 一直计算
                while (!chars.isEmpty() && priority(c)) {
                    Double after = result.pop();
                    Double before = result.pop();
                    char operation = chars.pop();
                    switch (operation) {
                        case '+':
                            result.push(before + after);
                            break;
                        case '-':
                            result.push(before - after);
                            break;
                        case '*':
                            result.push(before * after);
                            break;
                        case '/':
                            result.push(before / after);
                            break;
                        default:
                    }
                }
                if (!"=".equals(c + "")) {
                    chars.push(c);
                    if (")".equals(c + "")) {
                        chars.pop();
                        chars.pop();
                    }
                }
            }
        }
        //返回计算结果
        return result.pop();
    }

    private boolean priority(char c) {
        if ("(".equals(chars.peek() + "")) {
            return false;
        }
        //c 需要入符号栈
        char peek = chars.peek();
        switch (c) {
            case '.':
            case '+':
            case '=':
            case '-':
            case ')':
                //不入栈 去计算
                return true;
            case '*':
            case '/': {
                if (peek == '+' || peek == '-') {
                    return false;
                }
                return true;
            }
            case '(':
                return false;
            default:
        }

        return false;
    }

    public boolean isNumber(Character number) {
        return (number <= 57 && number >= 48) || number == '.';
    }
}

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuZhan7710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值