Leetcode 227-基本计算器 II

题解

本题不包含括号,比较简单

双栈法(运算符栈+数字栈)

对于「任何表达式」而言,可以都使用两个栈 nums 和 ops(本题只用到了nums):

nums : 存放所有的数字

ops :存放所有的数字以外的操作

然后从前往后做,对遍历到的字符做分情况讨论:

1.空格 : 跳过

2.数字 : 从当前位置开始继续往后取,将整一个连续数字整体取出,加入 nums

num=num*10+(ci-'0')

细节:

对于第一个数字,其之前的运算符视为加号

若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾

3.+ - * / ^ % :

1)遇到符号说明之前的数字遍历结束了,之前的数字num和符号preSign就要经过计算存进栈中:

乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。

加号:将数字压入栈;

减号:将数字的相反数压入栈;

2)将当前的符号更新为preSign,将nums置为0

bash 复制代码
class Solution {
    public int calculate(String s) {
        //数字num是和已有的运算符sign做计算
        Stack<Integer> nums=new Stack<>();
        //Stack<Character> ops=new Stack<>();
        char[] str=s.toCharArray();
        //对于第一个数字,其之前的运算符视为加号
        char preSign = '+';
        //记录当前数字大小
        int num=0;

        for(int i=0;i<str.length;i++){
            char c=str[i];
            if(c>='0'&&c<='9'){
                num=num*10+(c-'0');
            }
            //1.c不为数字,且不为空-->c是计算符号 2.遍历到了字符串末尾
            //以上情况说明前面的数字遍历结束了,遇到了下一个符号,要对前面的数字和字符做计算,计算完后再用计算结果更新数字栈,用当前字符更新符号栈

            //注意:这里一定不能和上面的if(c>'0'&&c<'9')是if..else的关系,否则最后一个数字只会进入上一个if,不会判断是否i==str.length-1
            if(!Character.isDigit(c) && s.charAt(i) != ' '||i == str.length-1){
                switch(preSign){
                    case '+':
                    nums.push(num);break;
                    case '-':
                    nums.push(-num);break;
                    case '*':
                    nums.push(nums.pop()*num);break;
                    case '/':
                    nums.push(nums.pop()/num);break;
                }
                // 更新符号为当前符号,数字清零
                preSign=c;
                num=0;
            }
        }
        // 将栈中所有结果求和就是答案
        int res = 0;
        while (!nums.isEmpty()) {
            res += nums.pop();
        }
        return res;
    }
}
相关推荐
lzhdim4 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ6 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one8 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David9 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
lll23526917799 小时前
HR如何快速整理面试沟通内容?
面试·职场和发展
零售校长9 小时前
西湖区零售门店店长面试怎么准备
面试·职场和发展·零售
秋天的怀念_David9 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪10 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪10 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
java_nnnn11 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode