计算器的实现-Java 代码

用Java 实现的计算器,原理看代码注释

public class MyCalculator {

    public static void main(String[] args) {
        String obj = "6+(8/2)+6/3+1*8 + 30";
        ArrayList<String> arrayList = strFormat(obj);
        System.out.println(obj + "=" + calculator(arrayList));
    }


    /**
     * 采用后续表达式计算结果
     * 1、当前字符串为数字时,直接入栈
     * 2、当前字符串为计算符时,取出栈中的前两个计算
     * 3、将计算结果再放入到栈中,栈中最后剩余的一个元素就是要求的结果
     */
    private static int calculator(ArrayList<String> obj) {
        ArrayList<String> result = transform(obj);
        System.out.println(result);
        Stack<Integer> stack = new Stack<>();

        for (int i = 0; i < result.size(); i++) {
            String symbol = result.get(i);
            if (isDigital(symbol)) { //数字直接入栈
                stack.push(Integer.parseInt(symbol));
            } else { // 处理操作符
                int num1, num2;
                num1 = stack.pop(); //取出两个数
                num2 = stack.pop();
                switch (symbol) {
                    case "+":
                        stack.push(num2 + num1);
                        break;
                    case "-":
                        stack.push(num2 - num1);
                        break;
                    case "*":
                        stack.push(num2 * num1);
                        break;
                    case "/":
                        stack.push(num2 / num1);
                        break;
                    default:
                        break;
                }
            }
        }
        return stack.pop();
    }

    /**
     * 中序遍历改为后续遍历
     */
    private static ArrayList<String> transform(ArrayList<String> arrayList) {
        Stack<String> stack = new Stack<>();
        ArrayList<String> result = new ArrayList<>();
        for (int index = 0; index < arrayList.size(); index++) {
            String symbol = arrayList.get(index);
            if (isDigital(symbol)) { //如果是数字直接输出
                result.add(symbol);
            } else if (symbol.equals(")")) {
                String tmp;
                while (!(tmp = stack.pop()).equals("(")) { // 匹配成功后停止
                    result.add(tmp);
                }
            } else {
                if (stack.isEmpty()) {
                    stack.push(symbol);
                    continue;
                }
                String tmp = stack.peek();
                while (outPriority(symbol) <= inPriority(tmp)) {  //优先级小于栈内优先级,一直出栈
                    result.add(tmp);
                    stack.pop();
                    if (stack.isEmpty()) {
                        break;
                    }
                    tmp = stack.peek();
                }
                stack.push(symbol);
            }
        }
        //将剩余的出栈
        while (!stack.isEmpty()) {
            result.add(stack.pop());
        }
        return result;
    }

    /**
     * 首先对String 进行格式化 转化成ArrayList
     * @param src 3*5+8;
     * @return ArrayList 3 * 5 + 8
     */
    private static ArrayList<String> strFormat(String src) {
        if (src == null || src.equals("")) {
            return null;
        }
        ArrayList<String> arrayList = new ArrayList<>();
        StringBuilder comChar = new StringBuilder();
        for (int i = 0; i <src.length(); i++) {
            char ch = src.charAt(i);
            if (ch == ' ') {
                continue;  //去除空格
            }
            if (!Character.isDigit(ch)) {
                if (!comChar.toString().trim().equals("")) {
                    arrayList.add(comChar.toString().trim());
                    comChar.delete(0, comChar.length());
                }
                arrayList.add(ch + "");
                continue;
            }
            comChar.append(ch);
        }
        if (!comChar.toString().trim().equals("")) {
            arrayList.add(comChar.toString().trim());
        }
        return arrayList;
    }

    /**
     * 判断是否为数字
     * @param symbol 782  或者 + - * /
     * @return true or false
     */
    private static boolean isDigital(String symbol) {
        return !symbol.equals("+") && !symbol.equals("-")
                && !symbol.equals("*") && !symbol.equals("/")
                && !symbol.equals("(") && !symbol.equals(")");
    }

    private static int inPriority(String ch) {
        switch (ch) {
            case "+":
            case "-":
                return 2;
            case "*":
            case "/":
                return 4;
            case ")":
                return 7;
            case "(":
                return 1;
            default:
                return 0;
        }
    }

    private static int outPriority(String ch) {
        switch (ch) {
            case "+":
            case "-":
                return 3;
            case "*":
            case "/":
                return 5;
            case ")":
                return 1;
            case "(":
                return 7;
            default:
                return 0;
        }
    }
}
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 Java 计算器扩展功能实现代码,包括了基本的加减乘除四则运算和取余、开方、阶乘等扩展功能: ``` import java.util.Scanner; public class Calculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入第一个数:"); double num1 = scanner.nextDouble(); System.out.print("请输入运算符(+、-、*、/、%、sqrt、!):"); String operator = scanner.next(); if ("+".equals(operator)) { System.out.print("请输入第二个数:"); double num2 = scanner.nextDouble(); System.out.println(num1 + " + " + num2 + " = " + (num1 + num2)); } else if ("-".equals(operator)) { System.out.print("请输入第二个数:"); double num2 = scanner.nextDouble(); System.out.println(num1 + " - " + num2 + " = " + (num1 - num2)); } else if ("*".equals(operator)) { System.out.print("请输入第二个数:"); double num2 = scanner.nextDouble(); System.out.println(num1 + " * " + num2 + " = " + (num1 * num2)); } else if ("/".equals(operator)) { System.out.print("请输入第二个数:"); double num2 = scanner.nextDouble(); if (num2 == 0) { System.out.println("除数不能为0!"); } else { System.out.println(num1 + " / " + num2 + " = " + (num1 / num2)); } } else if ("%".equals(operator)) { System.out.print("请输入第二个数:"); double num2 = scanner.nextDouble(); System.out.println(num1 + " % " + num2 + " = " + (num1 % num2)); } else if ("sqrt".equals(operator)) { System.out.println("√" + num1 + " = " + Math.sqrt(num1)); } else if ("!".equals(operator)) { int result = 1; for (int i = 1; i <= (int)num1; i++) { result *= i; } System.out.println(num1 + "! = " + result); } else { System.out.println("不支持该运算符!"); } } } ``` 在这个实现中,我们使用了 Scanner 类来读取用户输入的数据,然后根据用户输入的运算符进行相应的计算。在除法运算中,我们还进行了除数不能为0的判断。在阶乘运算中,我们使用了一个 for 循环来计算阶乘的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值