LeetCode 224. 基本计算器

224. 基本计算器

难度困难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-。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值