描述
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
提示:
1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
栈存临时结果和符号
代码
class Solution { public int calculate(String s) { Deque<Integer> stack = new ArrayDeque<>(); int sign = 1;//1:正,0:负 int res = 0; int length = s.length(); char[] chars = s.toCharArray(); for (int i = 0; i < length; i++) { char ch = chars[i]; if (Character.isDigit(ch)){ int cur = ch - '0'; while (i+1 < length && Character.isDigit(chars[i+1])){ cur = cur * 10 + (chars[i+1] - '0'); i++; } res = res + sign * cur; } else if (ch == '+'){ sign = 1; } else if (ch == '-'){ sign = -1; } else if (ch == '('){ stack.push(res); res = 0; stack.push(sign); sign = 1; } else if (ch == ')'){ res = stack.pop() * res + stack.pop(); } } return res; } }