力扣刷题Day 11 | 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

20. 有效的括号

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili

笔记

  1. 用字典存放括号对
  2. 遍历字符串,如果遇到左括号,把对应的右括号存入栈。如遇到右括号,看看栈顶元素是否相等,相等则弹出栈顶右括号
  3. 遍历结束若栈为空则满足条件
  4. 每次要看栈顶元素的时候需要判断栈是否非空
  5. 第二个做法是直接用栈,不用字典,思路和第一个差不多

Python代码

# 用字典和栈
class Solution:
    def isValid(self, s: str) -> bool:
        tmp = {'(':')', '{':'}', '[':']'}
        stack = []

        for item in s:
            if item in tmp.keys():  # 若是左括号,把对应的右括号加入栈
                stack.append(tmp[item])
            elif not stack or stack[-1] != item: # 若是右括号,若栈为空或栈顶元素不等于当前右括号,匹配失败
                return False
            else: # 若是右括号,栈不为空且栈顶元素和当前右括号相等,说明匹配成功,弹出栈顶右括号
                stack.pop()
        return True if not stack else False # 若最后栈为空说明满足要求

# 只用栈,思路一样
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:
                return False
            else:
                stack.pop()
        if stack:
            return False
        else:
            return True


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

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili

笔记

  1. 用栈的思路比较简单,如果遇到栈顶元素和当前元素相同就弹出栈顶元素,最后返回栈里的所有元素组成的字符串

Python代码

class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        for item in s:
            if not stack or item != stack[-1]: # 若栈为空或栈顶元素和当前元素不等,把元素入栈
                stack.append(item)
            else: # 栈不为空且栈顶元素和当前元素相等,弹出栈顶元素
                stack.pop()
        return "".join(stack)


150. 逆波兰表达式求值

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili

笔记

  1. Python字符串的isdigit()、isnumeric()方法都不能判断负数,如‘-1’.isdigit()返回False。因此遍历后缀表达式的时候,先判断遇到的是不是加减乘除这几个符合,不是的话就是数字的情况,转为int加入栈顶。int()可以处理负数,如int('-1')返回整数-1
  2. 题目要求除法向0截断,也就是当商为小数的时候结果取靠近0方向最近的那个整数。Python自带的整除法//是默认向下取整,如果商为正数,那么用//符合向0截断。但若遇到商为负数且不能整除的时候,//返回的向下取整结果是更小的负数,是远离0方向的最近的整数,不符合向0截断的要求。因此,若遇到不能整除且商为负数的情况,需要把//的结果加1

Python代码

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        oprand = ['+','-','*','/']

        for item in tokens:
            if item in oprand: # 遇到符号
                op1 = stack.pop()
                op2 = stack.pop()
                if item == '+':
                    stack.append(op2 + op1)
                elif item == '-':
                    stack.append(op2 - op1)
                elif item == '*':
                    stack.append(op2 * op1)
                else: #  item == '/'
                    if op2 % op1 != 0 and ((op2 > 0 and op1 < 0) or (op2 < 0 and op1 > 0)):
                        stack.append(op2 // op1 + 1)  # 不能整除且商为负数,向0截断
                    else: 
                        stack.append(op2 // op1)

            else: # 遇到数字,压入栈
                stack.append(int(item))
                
        return stack.pop()

你可能感兴趣的:(算法刷题,算法,python,leetcode)