代码随想录算法训练营第十一天(py)| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

20.有效的括号(easy)

力扣链接
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

思路

有三种不匹配的情况

1. 左括号多余:([{}]()
2. 右括号多余:([{}])))
3. 没有多余但是类型不匹配:([{}}}

可以创建一个栈,遍历字符串s,当遇到左括号时,push一个对应类型的右括号;当遇到右括号时,判断pop出来的括号是否跟他一样,不一样则返回false。遍历完成后如果栈为空,则返回true。

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        quote_dict = {'(':')', '{':'}', '[':']'}
        for quote in s:
            if quote in quote_dict:
                stack.append(quote_dict[quote])
            else:
                if stack == []:  # 判断没有左括号的情况
                    return False
                else:
                    pop = stack.pop()
                    if quote != pop:
                        print(quote, pop)
                        return False
        if stack == []:
            return True
        else:
            return False

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

力扣链接
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

思路

建立一个栈,对str中的每个char,对比其是否与栈顶元素相同,如果相同则出栈,否则压栈。

class Solution:
    def removeDuplicates(self, s: str) -> str:
        # 如果当前字符与栈顶相同则pop,否则压栈
        stack = []
        s = list(s)

        for char in s:
            if len(stack)!=0 and stack[-1] == char:
                stack.pop()
            else:
                stack.append(char)
        
        res = ''.join(stack)

        return res

150. 逆波兰表达式求值(normal)

力扣链接
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。

释义

逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
示例 1:

输入: [“2”, “1”, “+”, “3”, " * "]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:

输入: [“4”, “13”, “5”, “/”, “+”]
输出: 6
解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

思路

其实逆波兰表达式相当于是二叉树中的后序遍历,但暂时没必要用二叉树来解决。
建立一个栈,依次往里面压tokens元素,当遇到运算符时,出栈两个元素进行运算,并把结果再压回去。
注意在处理负数除法时,x//y和int(x/y)的区别

x1 = 6
x2 = -6
y = 4
print(x1//y, int(x1/y))
print(x2//y, int(x2/y))
运行结果:
1 1
-2 -1
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = [] # 用来存数字
        operator = ["+", "-", "*", "/"]
        for char in tokens:
            if char not in operator:
                stack.append(char)
            else:
                t1 = int(stack.pop())
                t2 = int(stack.pop())
                if char == "+":
                    res = t1 + t2
                elif char == "-":
                    res = t2 - t1
                elif char == "*":
                    res = t2 * t1
                else:
                    # res = t2 // t1 需要向0取整,遇到负数时这样会出错
                    res = int(t2/t1)
                stack.append(res)
        print(stack)
        return(int(stack[0]))
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值