java实现整数计算器

记牛客网一道基础算法题,栈+递归实现

描述
请写一个整数计算器,支持加减乘三种运算和括号。

数据范围:0<= |s| <= 100,保证计算结果始终在整型范围内

要求:空间复杂度: O(n),时间复杂度 O(n)

示例:
字符串:(2*(3-4))*5
计算结果:-10

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
     
    
    public int solve (String s) {
        // write code here
       
        Stack<Integer> numStack = new Stack<>();
        s = s.replaceAll(" ", "");
        char[] chs = s.toCharArray();
        char sign = '+';
        int num = 0;
        for(int i = 0 ; i < s.length(); i ++){
            
            // 处理数字
            if(Character.isDigit(chs[i])){
                int j = i;
                
                while(j < chs.length && Character.isDigit(chs[j])){
                    num = num * 10 + chs[j++] - '0';
                }
                i = j - 1;
            }
            
            // 先处理括号
            if('(' == chs[i]){
                
                // 括号数量,第一个左括号,数量为1,每多一个左括号,数量+1
                // 直到括号数量减为0,证明最大的括号已经被找到,开始递归计算
                // 如果多个括号分开成对,分别处理
                int tempNum = 1;
                for(int j = i + 1; j < s.length(); j++){
                    if(s.charAt(j) == '(') tempNum++;
                    if(s.charAt(j) == ')') tempNum--;
                    if(tempNum == 0){
                        num = solve(s.substring(i + 1, j));
                        i = j;
                        break;
                    }
                }
                
            }
            
            // 当前是数字,不参与计算
            // 遇到操作符时,将当前操作符之前的数字,进行入栈,或者乘除计算
            // 加、减操作,数字直接入栈,不进行计算,因为加减优先级最低
            // 将减操作转换为负数,方便最后统一按加法计算
            // 乘除计算,可以将当前栈中元素弹出,进行计算,因为乘除优先
            
            // 如果是右括号,则忽略,继续往后扫描,下一位肯定是运算符
            if(!Character.isDigit(chs[i]) || i == chs.length - 1){
                if(sign=='+') numStack.push(num);
                else if(sign=='-') numStack.push(-1*num);
                else if(sign=='*') numStack.push(numStack.pop()*num);
                else if(sign=='/') numStack.push(numStack.pop()/num);
                
                sign = chs[i];
                num = 0;
            }
            
        }
        
        int result = 0;
        // 将栈中的元素进行加法计算
        while(!numStack.isEmpty()){
            result += numStack.pop();
        }
        return result;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值