表达式计算器

该文章展示了一个用Java编写的简单计算器,它支持加、减、乘、除四种运算,遵循运算符优先级规则。程序通过将中缀表达式转换为后缀表达式,然后使用栈进行计算。输入限制为不超过10个符号,数字范围在0到100之间,不处理小数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现一个简单的计算器,仅支持:+ - * / 四种运算,其中 * 和 / 运算优先级高于 + -,相同优先级的计算按先后顺序计算,限制如下:

  1. 输入的符号数不超过10个

  2. 每个数字的范围在0~100之间,包含0,不包含100

  3. 不用考虑小数问题,即:4/3可以当作1来处理

示例如下:

示例一:
输入:3+5-2*3
输出:2
示例二:
输入:31*3/3-30
输出:1

 直接上代码:

package com.yaxin.show.config;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.Stack;

public class calculator {

    // 操作数栈
    private static Stack<Double> Operands;
    // 操作符栈
    private static Stack<Character> Operators;
    // 操作符集合
    private static final Set<Character> C_OperatorSet = new HashSet<Character>() {
        /**
         *
         */
        private static final long serialVersionUID = 1L;

        {
            add('+');
            add('-');
            add('*');
            add('/');
            add('(');
            add(')');
        }
    };

    private static int getOperatorPriority(char ch) {
        if (ch == '+' || ch == '-')
            return 0;
        else if (ch == '*' || ch == '/')
            return 1;
        else
            return -1;
    }

    private static String infixToSuffix(String expression) {
        Operators = new Stack<>();
        Operators.clear();
        StringBuilder sBuilder = new StringBuilder();
        for (int i = 0; i < expression.length(); i++) {
            char ch = expression.charAt(i);
            if (ch == ' ')
                continue;
            if (C_OperatorSet.contains(ch)) {
                if (Operators.empty()) {
                    if (ch == ')') {
                        System.out.println("表达式不正确");
                        return sBuilder.toString();
                    }
                    Operators.push(ch);
                } else if (ch == '(') {
                    Operators.push(ch);
                } else if (ch == ')') {
                    char top;
                    while ((top = Operators.peek()) != '(') {
                        if (Operators.empty()) {
                            System.out.println("表达式不正确");
                            return sBuilder.toString();
                        }
                        sBuilder.append(top);
                        Operators.pop();
                    }
                    Operators.pop();
                } else {
                    char top = Operators.peek();
                    if (getOperatorPriority(ch) <= getOperatorPriority(top)) {
                        while (!Operators.empty()
                                && getOperatorPriority(ch) <= getOperatorPriority(top = Operators.peek())) {
                            sBuilder.append(top);
                            Operators.pop();
                        }
                    }
                    Operators.push(ch);
                }
            } else {
                sBuilder.append("[" + ch);
                while (i + 1 < expression.length()
                        && ((expression.charAt(i + 1) >= '0' && expression.charAt(i + 1) <= '9'))) {
                    ch = expression.charAt(i + 1);
                    sBuilder.append(ch);
                    ++i;
                }
                sBuilder.append(']');
            }
        }
        while (!Operators.empty()) {
            sBuilder.append(Operators.peek());
            Operators.pop();
        }
        return sBuilder.toString();
    }

    public static double evalExp(String expression) {
        Operands = new Stack<>();
        Operands.clear();
        double ret = 0;
        String suffix = infixToSuffix(expression);
        System.out.println("suffix: " + suffix);
        for (int i = 0; i < suffix.length(); i++) {
            if (suffix.charAt(i) == '[') {
                i++;
                int beginIndex = i, endIndex = i;
                while (']' != suffix.charAt(i)) {
                    i++;
                    endIndex++;
                }
                Operands.push(Double.valueOf(suffix.substring(beginIndex, endIndex)));
            } else {
                double left, right, res = 0;
                right = Operands.pop();
                left = Operands.pop();
                switch (suffix.charAt(i)) {
                    case '+':
                        res = left + right;
                        break;
                    case '-':
                        res = left - right;
                        break;
                    case '*':
                        res = left * right;
                        break;
                    case '/':
                        res = left / right;
                        break;
                }
                Operands.push(res);
            }
        }
        ret = Operands.pop();
        return ret;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个含+-*/的表达式,请确认输入合法");
        String expression = input.nextLine();
        System.out.println(expression + " =" + evalExp(expression));
        input.close();
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

何以清风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值