栈 224. 基本计算器
题目描述
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
示例 1:
输入:s = "3 - 2"
输出:1
提示:
1 <= s.length <= 3 * 105
s
由数字、'+'
、'-'
、'('
、')'
、和' '
组成s
表示一个有效的表达式
思路:+ - 用sign表示 +-1,初始值为+1,
循环遍历,当遇到3时计算结果为3,遇到-号时记录sign为-1,遇到2时直接就3 + sign*2的到结果为1
如果遇到了左括号则,记录ret 和 sign push到栈里面,初始化ret = 0,sign = 1,就可以开始计算括号里面的值了,遇到右括号,则可以用 ret = ret*stack.pop() + stack.pop(),合并里面和栈里计算好的值
public static int calculate(String s) {
Stack<Integer> stack = new Stack<>();
int count = 0;
int sign = 1;
int ret = 0;
while (count < s.length()) {
if (s.charAt(count) == '+') {
sign = 1;
} else if (s.charAt(count) == '-') {
sign = -1;
} else if (s.charAt(count) >= '0' && s.charAt(count) <= '9') {
int num = 0;
while (count < s.length() && s.charAt(count) >= '0' && s.charAt(count) <= '9') {
num = s.charAt(count) - '0' + num * 10;
count++;
}
ret = ret + num * sign;
count--;
} else if (s.charAt(count) == '(') {
stack.push(ret);
ret = 0;
stack.push(sign);
sign = 1;
} else if (s.charAt(count) == ')') {
ret = ret*stack.pop() + stack.pop();
}
count++;
}
return ret;
}
解题过程,一开始我直接分离数字与符号,没想到括号是有影响的,加入了括号的影响,没想到有 -1 + 2这种骚操作,看了一遍官方题解,没看懂,掘金复习一遍中缀表达式,后缀表达式,强行学习转换了后缀表达式,但是只考虑了10已内的运算,吐血,又看了一遍其他人的题解,才想通可以这样做,其实可是可以强行转后缀优化的,懒得搞了,玩了一两天,感觉真tm酸爽
评论区