算法训练第十一天 | 栈和队列 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

LeetCode 20. 有效的括号

题目链接

20. 有效的括号

思路

遍历字符串
1、左方向的就往栈中加入对应右方向
2、右方向的就判断是否和栈顶元素相同,相同就pop,不相同False(说明符号串位)
3、如果栈空而元素未遍历结束,返回False(说明右方向的多了)。如果元素遍历结束但栈为空,返回False(说明左方向多了)

class Solution:
    def isValid(self, s: str) -> bool:
        stack_out = []
        res = list(s)

        for i in res:
            if i == '(':
                stack_out.append(')')
            elif i == '{':
                stack_out.append('}')
            elif i == '[':
                stack_out.append(']')
            else:
                
                if stack_out and i == stack_out[-1]:
                    stack_out.pop()
                else:
                    return False
        if stack_out:
            return False
        else:
            return True

反思

总结是不符合的情况一共只有三种:
1、(({[]}) (左边多了)
2、(){[}](左右不对称,串了
3、({}[]))))) (右边多了)
把这三种情况都考虑进去就可以了

LeetCode 1047. 删除字符串中的所有相邻重复项

题目链接

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

思路

还是一样的做匹配操作,如果遍历的元素与栈顶元素一致,则取出,否则加入栈

class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        res = list(s)
        for i in res:
            if stack and i == stack[-1]:
                stack.pop()
            else:
                stack.append(i)
        return "".join(stack)

反思

对栈的基础运用

LeetCode 150. 逆波兰表达式求值

题目链接

150. 逆波兰表达式求值

思路

遍历字符串数组,如果拿到的是数字,存入栈中,如果拿到的是运算符号,取出栈中前两个元素,运算后的结果再存入栈中,直至遍历结束且栈为空

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for i in tokens:
            if i not in {'+', '-', '*', '/'}:
                stack.append(i)
            else:
                secondnum, firstnum= stack.pop(), stack.pop()
                result = int(eval(f'{firstnum} {i} {secondnum}'))    #输出结果保留整数,要加int
                stack.append(result)
        return int(stack.pop())

反思

问题一:取出的是操作符,怎么表示我要运算(除了写4个if)
解决方案:eval()函数

eval(f'{firstnum} {i} {secondnum}')

新学习:f’’ (格式化字符串常量)
f-string在功能方面不逊于传统的%-formatting语句和str.format()函数

>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值