一个有关计算器的算法题

题目:实现一个一位数字的四则运算计算函数,输入是一个char数组,输出是计算结果。

          比如输入是char[] inputs = {'1','+','2','*','3'},输出是7。输入的字符里面,如果是数字,则只有一位;如果是符号,则只有加减乘除四个运算符,没有括号

答案:

    /**
     * 确定操作符优先级
     * @param first
     * @param second
     * @return
     */
    public static boolean highPriority(char first, char second){
        return (second == '*' || second == '/') && (first == '+' || first == '-');
    }

    /**
     * 计算放值
     * @param num
     * @param operate
     */
    public static void calculate(Stack<Integer> num, char operate){
        switch (operate){
            case '+':
                num.add(num.pop()+num.pop());
                break;
            case '-':
                Integer pop = num.pop();
                num.add(num.pop() - pop);
                break;
            case '*':
                num.add(num.pop()*num.pop());
                break;
            case '/':
                Integer div = num.pop();
                num.add(num.pop()/div);
                break;
        }
    }


    public static int cal(char[] input){
        //新建一个栈放置数组中的数字
        Stack<Integer> calResult = new Stack<>();
        //新建一个栈放置操作符
        Stack<Character> operation = new Stack<>();
        //一次循环将所有值分别放置到两个栈中
        for(Character c : input){
            //判断这个字符是不是数字,要是数字就放置在数字栈中
            if(Character.isDigit(c)){
                calResult.add(c-'0');
            }else{
                //若获取的字符是操作符,则先判断操作符栈是否为空,若不为空则判断操作符的优先级
                //若操作符栈顶元素优先级高于当前操作符,则先进行数据计算操作,一直到栈顶元素优先级和当前操作符相同,或者低于的。
                while(!operation.empty() && !highPriority(operation.peek(),c)){
                    calculate(calResult,operation.pop());
                }
                //若操作符栈顶元素优先级低于当前操作符,直接放进去
                operation.add(c);
            }
        }
        //一轮循环结束,剩下的都是加减,直接进行计算即可
        while (!operation.empty()){
            calculate(calResult,operation.pop());
        }
        return calResult.pop();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值