Day11

第十一天 栈与队列part02

LC20有效的括号

  1. 代码:
    在这里插入图片描述
  2. 更为简洁的代码
    • 遍历过程中每次碰到左括号栈就入栈对应的右括号
    • 当碰到右括号判断出栈元素是否等于右括号,不等则直接return false
    • 当栈为空说明右括号多了,return false
    • 最后如果栈不为空也return false,说明左括号多了
      在这里插入图片描述

LC1047删除字符串中的所有相邻重复项

  1. 代码
    在这里插入图片描述
  2. 减少空间复杂度:使用字符串的拼接操作,原本栈中字符的逆序直接使用字符串的拼接解决:
    在这里插入图片描述

LC150逆波兰表达式(超时5min

  1. 超时分析:
    • 字符串判断相等应该用equals,而不是equal和==
  2. 代码:
    在这里插入图片描述
  3. 知识点
    • 我们平常所熟知的算式是中缀表达式,但是中缀表达式因为运算符的优先级对计算机运算并不是很友好
    • 逆波兰表达式,其实就是一种后缀表达式
    • 后缀表达式的优点:
      • 去掉括号后表达式无歧义,(1+2)*(3+4)=》((12+)(34+)*)=》12+34+*
      • 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中
  4. 难点:中缀表达式转后缀表达式
    • 准备一个栈用来存放操作符和括号,准备一个数组用来存放数字和弹出的字符
    • 遇到操作数,直接存储在数组中
    • 遇到操作符
      • 栈为空、该操作符的优先级比栈顶的操作符的优先级高(该操作符需要先运算,根据栈的后入先出,肯定是入栈放在栈顶之后)=》压栈
      • 该操作符的优先级比栈顶的操作符优先级低 or 相同=》弹出栈顶操作符存储,并将该操作符压栈
    • 遍历结束后将栈里的操作符依次全部弹出,依次存储在数组末尾
    • 括号的处理:一个括号就相当于一个独立的式子
      • 遇见左括号=》左括号入栈
      • 遇到操作符=》栈为空、该操作符的优先级比栈顶的操作符的优先级高、如果栈顶为左括号(类比于栈为空的情况)=》压栈
      • 遇到右括号=》弹出栈中的操作符直到遇到左括号(左括号出栈但不存储)
    • 负数的处理:负数会对处理造成影响只可能是负数出现在开头(1. 表达式的开头:-1+5*3。2.括号子式的开头:3+(-6)/2)其他情况都看作是-
      • 处理:遇到负数时首先存储一个0,这样就可以通过减法来模拟负数
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值