使用栈解题:Leetcode 20 有效括号 + Leetcode 150 逆波兰表达式

使用栈解题:Leetcode 20 有效括号 + Leetcode 150 逆波兰表达式

Leetcode 20 有效括号

题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

题解

很经典的一道利用栈的题目,而且在 python 中,利用 list 数据结构的 appendpop 函数就可以轻松的做到实现栈:

思路如下:

  1. 如果碰到左括号,则直接压入栈中
  2. 如果碰到右括号,则判断栈顶是否是对应的左括号(比如 “)” 与 “(” )。如果是,则将栈顶;如果不是,则将右括号压入栈中。(注:在这里我是先都压进去,然后判断是否需要将栈顶两个元素同时pop出来,来实现的)
  3. 所有元素运行完后,如果栈为空,则为有效括号,如果栈非空,则为无效括号。

代码

代码如下:

def isValid(s):
    lst = []
    for i in s:
        lst.append(i)
        if len(lst) == 1:
            continue
        else:
            a = lst[-2]
            b = lst[-1]
            if a == "(":
                if b == ")":
                    lst.pop()
                    lst.pop()
            elif a == "[":
                if b == "]":
                    lst.pop()
                    lst.pop()
            elif a == "{":
                if b == "}":
                    lst.pop()
                    lst.pop()
    if not lst:
        return True
    else:
        return False

执行结果

执行用时:16 ms,

内存消耗:11.8MB

Leetcode 150 逆波兰表达式

题目描述

根据逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9

示例 2:

输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6

题解

使用栈进行解题:遇到数字,则压入栈中;如果遇到的是运算符号,则取出栈顶两个元素,进行求解,再压回栈中,重复这样的操作直至结束就能得到最终的结果。

def evalRPN(tokens):
    if len(tokens) == 1:
        return int(tokens[0])
    Res = "inf"
    operation = ["+", "-", "*", "/"]
    lst = []
    for i in tokens:
        if i not in operation:
            lst.append(i)
        else:
            a = int(lst.pop())
            b = int(lst.pop())
            if i == "+":
                Res = a + b
            elif i == "-":
                Res = b - a
            elif i == "*":
                Res = a * b
            elif i == "/":
                Res = int(b / a)
            lst.append(Res)
    return Res

提交结果

执行时间:72 ms

内存消耗:13.4 MB

在这里插入图片描述

发布了12 篇原创文章 · 获赞 6 · 访问量 611

猜你喜欢

转载自blog.csdn.net/weixin_44618103/article/details/104111754