算法通关村—基本计算器问题解析

227. 基本计算器 II

基本计算器
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:

输入:s = “3+2*2”
输出:7

首先肯定是将字符串拆开,判断数字和加减乘除,数字需要从字符进行转化为数字,然后当遇到加法的时候,就把当前num添加到栈里面去,减法就是当前数的相反数,乘法和除法都需要将栈顶元素拿出来然后进行处理。最后需要计算栈内和。

步骤:

  1. 遍历字符串
  2. 判断数字,转换
  3. 加法,添加数字num,入栈
  4. 减法,添加数字相反数,入栈
  5. 乘法,栈顶元素和数字相乘,入栈
  6. 除法,栈顶元素和数字相除,入栈
  7. 栈求和
 public int calculate(String s) {
    
    
        Stack<Integer> stack = new Stack<>();
        // 当前num值
        int num = 0;
        // 默认选择
        char preSign = '+';
        for(int i=0;i<s.length();i++){
    
    
            // 判断字符是否是数字
        if(Character.isDigit(s.charAt(i))){
    
    
            // 转换为整数,多位字符进行拼接
            num = num * 10 +s.charAt(i)-'0';
        }
            // 不是数字,空格,不是最后一个字符
        if(!Character.isDigit(s.charAt(i)) && s.charAt(i) !=' ' || i==s.length()-1){
    
    
            switch(preSign){
    
    
                case '+':
                    // 添加
                    stack.push(num);
                    break;
                case '-':
                    // 添加负数
                     stack.push(-num);
                     break;
                case '*':
                    // 乘号去除栈顶元素和当前num相乘
                    stack.push(stack.pop()*num);
                    break;
                case '/':  
                    // 栈顶元素和当前num相除
                    stack.push(stack.pop()/num);             

            }
            // 获取当前的字符,更新
            preSign = s.charAt(i);
            // num归0,重置
            num=0;
        }
        }
        // 计算之和
        int ans = 0;
        while(!stack.isEmpty()){
    
    
            ans += stack.pop(); 
        }

        return ans;
    }

时间复杂度:O(n)遍历了一次字符串,然后进行判断
空间复杂度:O(n)栈内元素取出来进行相加

总结:这一题一开始没考虑到有多位数的情况,以及相应的字符判断是否为数字的方法不知道如何判断。

猜你喜欢

转载自blog.csdn.net/qq_52843958/article/details/132008118
今日推荐