三分钟用java实现简单的计算器

本文介绍了一个使用Java实现的简单计算器,通过两个栈分别存储数字和操作符,支持基本的加减乘除运算。代码详细展示了如何处理输入字符串,进行运算并返回结果。

如题,用java实现简单的计算器。

如:

输入:3+2*2, 输出:7
输入:3/2, 输出:1

解题思路:

使用栈的特性,出入栈。声明两个栈,分别存数字和操作符。
将字符串转换为字符数组,循环,进行判断入栈,出栈和计算结果。
最后判断,如果操作符栈为空,则直接输出数字栈的结果,否则再计算一次然后返回结果。

代码如下:

public static Integer calc(String str){
        char[] chars = str.toCharArray();

        Stack<Integer> dataStack = new Stack();
        Stack<Character> operStack = new Stack();

        int len = chars.length;
        for(int i = 0; i < len; i++){
            char ch = chars[i];
            // 判断是否是数字
            if(Character.isDigit(ch)){
                if(operStack.empty()){
                    //操作符栈为空,则直接将数字入栈
                    dataStack.push(ch - '0');
                }else{
                    dataStack.push(ch - '0');
                    char oper = operStack.peek();
                    //否则,判断操作符栈栈顶元素是否是乘号或除号,是则进行计算
                    if(oper == '*' || oper == '/'){
                        Integer res = doCalc(dataStack, operStack.pop());
                        dataStack.push(res);
                    }
                }
            }else if(ch == '+' || ch == '-'){ // 判断是否是加或减
                if(dataStack.size() >= 2){
                    //这里需要判断数字栈是否大于等于2(即够一次运算)
                    Integer res = doCalc(dataStack, operStack.pop());
                    dataStack.push(res);
                }
                operStack.push(ch);
            }else if(ch == '*' || ch == '/'){ // 判断是否是乘或除
                if(operStack.empty()){
                    operStack.push(ch);
                }else{
                    char oper = operStack.peek();
                    //判断操作符栈栈顶元素是否是乘或除,如果是,则进行计算
                    if(oper == '*' || oper == '/'){
                        Integer res = doCalc(dataStack, operStack.pop());
                        dataStack.push(res);
                    }
                    operStack.push(ch);
                }
            }
        }
        if(operStack.empty()){
            return dataStack.peek();
        }else{
            return doCalc(dataStack, operStack.pop());
        }
    }

函数doCalc进行四则运算,代码如下:

private static Integer doCalc(Stack<Integer> data, char oper){
        Integer a = data.pop();
        Integer b = data.pop();
        switch(oper){
            case '+':
                return b + a;
            case '-':
                return b - a;
            case '*':
                return b * a;
            case '/':
                return b / a;
                default:
        }
        return 0;
    }

总结:

  1. 首先要知道Stack相关的方法。例如pop()是出栈, push()是入栈,peek()只是将栈顶元素取出来,并不会出栈。
  2. 判断字符是否是数字。
  3. 本程序只能实现简单的无符号的加减乘除运算。也是本人第一感觉写出来的代码。难免有问题,或者有更好的方法。欢迎指正!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值