Leetcode227-基本计算器II
- IT业界
- 2025-09-05 13:45:02

题解
本题不包含括号,比较简单
双栈法(运算符栈+数字栈)对于「任何表达式」而言,可以都使用两个栈 nums 和 ops(本题只用到了nums): nums : 存放所有的数字 ops :存放所有的数字以外的操作
然后从前往后做,对遍历到的字符做分情况讨论: 1.空格 : 跳过 2.数字 : 从当前位置开始继续往后取,将整一个连续数字整体取出,加入 nums num=num*10+(c[i]-‘0’) 细节: 对于第一个数字,其之前的运算符视为加号 若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾 3.+ - * / ^ % : 1)遇到符号说明之前的数字遍历结束了,之前的数字num和符号preSign就要经过计算存进栈中: 乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。 加号:将数字压入栈; 减号:将数字的相反数压入栈; 2)将当前的符号更新为preSign,将nums置为0
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; } }Leetcode227-基本计算器II由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Leetcode227-基本计算器II”