LeetCode227:基本计算器II
Posted yuanyb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode227:基本计算器II相关的知识,希望对你有一定的参考价值。
感觉自己的思路还不错,比较简单清晰,代码量也比较少,没有用到记录运算符的变量或栈,就想把这个思路发一下博客。
题目:
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,"+", "-", "*", "/" 四种运算符和空格 " "。 整数除法仅保留整数部分。
思路:
使用一个栈用于暂存得不到计算的数字(无法确定优先级,比如当前是"+",那么可能下一个操作符是"*",所以暂时无法计算)。最终乘除操作符两侧的数会被得到计算并push进栈,最后相加即可。比如:
2 - 1 + 3 * 4 - 4 / 2 * 1 => 2 - 1 + [ 3 * 4 ] + [ -4 / 2 * 1 ] => 最终栈里面的情况为 [2, -1, 12, -2],然后计算和即可。
情况如下:
- 如果是空格,跳过即可;
- 如果是"+"或数字字符,则向栈中push进一个数字;
- 如果是"-",则获得下一个数字,并向栈中push进它的负数形式;
- 如果是"*",则获得下一个数字,并向栈中push进栈顶数字和下一个数字的乘积;
- 如果是"/",则获得下一个数字,并向栈中push进栈顶数字和和一个数字的商。
class Solution { public int calculate(String s) { Deque<Integer> stack = new ArrayDeque<>(); char ch; int[] ret; for (int i = 0; i < s.length(); i++) { ch = s.charAt(i); if (ch == ‘ ‘) continue; ret = getNextNumber(s, i); if (Character.isDigit(ch) || ch == ‘+‘) { stack.push(ret[0]); } else if (ch == ‘-‘) { stack.push(-ret[0]); } else if (ch == ‘*‘) { stack.push(stack.pop() * ret[0]); } else if (ch == ‘/‘) { stack.push(stack.pop() / ret[0]); } i = ret[1]; //调整索引为,获得的下一个数字的末尾索引 } // 返回计算结果 int[] ans = {0}; stack.forEach(num -> ans[0] += num); return ans[0]; } // 返回下一个数字 private int[] getNextNumber(String s, int i) { int num = 0; while (!Character.isDigit(s.charAt(i))) i++; while (i < s.length() && Character.isDigit(s.charAt(i))) num = 10 * num + s.charAt(i++) - ‘0‘; return new int[] {num, i-1}; // 返回得到的数字及该数字最后一个数字字符的索引 } }
以上是关于LeetCode227:基本计算器II的主要内容,如果未能解决你的问题,请参考以下文章