难度困难472
实现一个基本的计算器来计算一个简单的字符串表达式 s
的值。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1 <= s.length <= 3 * 105
s
由数字、'+'
、'-'
、'('
、')'
、和' '
组成s
表示一个有效的表达式
【分析】
使用栈来解决计算器问题:我们维护两个Stack,一个栈放数字numStack,一个符号栈signalStack。然后遍历字符串,
if 遇到‘(’,入符号栈;
else if 遇到+、-,如果signalStack.peek()也是+、-,则符号栈pop,然后数字栈pop两次,做运算,并将运算结果入数字栈,最后将符号入符号栈;如果signalStack is empty or stack.peek()是(,入栈。
else if 遇到‘)’,signalStack.peek()是+、-,则符号栈pop,然后数字栈pop两次,做运算,并将运算结果入数字栈,最后将符号栈顶(弹出;如果signalStack.peek()是(,直接弹出。
else if 遇到数字,我们维护一个StringBuffer sb, sb.append(数字),如果下一个字符还是数字,继续append,否则将sb转数字入数字栈。
当遍历完成后,如果符号栈不为空,将符号栈pop,然后数字栈pop两次,做运算,并将结果如数字栈;
最终数字栈的size会是1,结果即为所求。
注意特殊场景:
1、表达式以负数开头
2、存在(- 的场景
特殊处理:讲开头的-替换成0-,将(-替换成(0-。