2024/3/13--代码随想录算法训练营day11|20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

list()可以添加元素append()\移除元素pop()\栈顶 list[-1]
python一个初始化的list,永远不可能是None 可以用not list 或者len(list) == 0 检查是否为空

【stack.pop()和stack[-1]的区别:
1.pop()能返回栈顶元素并移除
2.stack[-1]仅仅返回栈顶元素】
eval(f’{op2}{i}{op1}')

20.有效的括号

力扣链接
在这里插入图片描述
明白那些情况不:
1.左括号多了
2.右括号多了,包括 这种 )(
3.括号不匹配 【{】}这种也是不匹配!

遇到左括号,就往栈里面,放对应的右括号 ;遇到右括号,就去删栈顶元素;
如果不匹配,或者匹配时栈为空,或者匹配结束,栈里还有都是不匹配

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for item in s:
            if item == '(':
                stack.append(')')
            elif item == '[':
                stack.append(']')
            elif item == '{':
                stack.append("}")
            elif not stack or stack[-1] != item:  #针对1.不匹配  2.右括号多了
                return False
            else:   #如果栈顶和item一样,就移除栈顶
                stack.pop()
        return True if not stack else False   #3.针对左括号多了

# 方法二,使用字典
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        mapping = {
            '(': ')',
            '[': ']',
            '{': '}'
        }
        for item in s:
            if item in mapping.keys(): #也可以直接用 if item in mapping:
                stack.append(mapping[item])
            elif not stack or stack[-1] != item: 
                return False
            else: 
                stack.pop()
        return True if not stack else False

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

力扣链接
在这里插入图片描述
匹配问题:删除重复项时,需要知道当前遍历的元素,前一步是不是也遍历过一样值的元素,所以需要用栈来记录遍历过的元素。

【在第一次写代码时,犯了错误,stack and stack[-1]是为了stack.pop()的时候,可以吐出。
                            其次栈为空,或者栈顶元素不匹配,都要添加item】
                            
方法一:使用栈
class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        for i in s:
            if stack and i == stack[-1]:
                stack.pop()
            else:
                stack.append(i)
        return ''.join(stack)

# 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。【第一轮没看明白】
class Solution:
    def removeDuplicates(self, s: str) -> str:
        res = list(s)
        slow = fast = 0
        length = len(res)

        while fast < length:
            # 如果一样直接换,不一样会把后面的填在slow的位置
            res[slow] = res[fast]
            
            # 如果发现和前一个一样,就退一格指针
            if slow > 0 and res[slow] == res[slow - 1]:
                slow -= 1
            else:
                slow += 1
            fast += 1
            
        return ''.join(res[0: slow])

150.逆波兰表达式求值

力扣链接
在这里插入图片描述

遇到数字就入栈,遇到运算符则去除栈顶的两个数字进行计算,将计算结果压入栈中

方法一,仅使用栈,更省空间
from operator import add,sub,mul
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        map = {"+":add, "-":sub, "*":mul,  "/":lambda x,y :int(x/y)}    ##!!!这个很重要,会写,本题成功 80%
        stack = []
        for i in tokens:
            if i not in map:
                stack.append(int(i))   #str转换成int
            else :
                op1 = stack.pop()   
                op2 = stack.pop()
                stack.append( map[i](op2,op1) )  #注意运算顺序,op1是除数 ,op2是被除数
        return stack.pop()

方法二,但因为使用eval相对较慢的方法
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for i in tokens:
            if i not in ["+","-","*","/"]:
                stack.append(int(i))
            else :
                op1,op2 = stack.pop(),stack.pop()
                stack.append(
                    int(eval(f'{op2}{i}{op1}'))   #eval返回的结果类型取决于表达式本身,但是结果都是整数
                    )
        return stack.pop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值