栈(Stack)的使用 LeetCode 第 20 题

特点:栈的最大特点就是后进先出(LIFO)。对于栈中的数据来说,所有操作都是在栈的顶部完成的,只可以查看栈顶部的元素,只能够向栈的顶部压⼊数据,也只能从栈的顶部弹出数据。

实现:利用一个单链表来实现栈的数据结构。而且,因为我们都只针对栈顶元素进行操作,所以借用单链表的头就能让所有栈的操作在 O(1) 的时间内完成。

LeetCode 第 20 题:给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意:空字符串可被认为是有效字符串。

示例 1

输入: "()"

输出: true

示例 2

输入: "(]"

输出: false

class Solution:
    def isValid(self, s: str) -> bool:
        len_s = len(s)
        if len_s % 2 != 0:
            return False
        if len_s == 0:
            return True
        # 利用进栈出栈的思想
        str_dict = {'(': ')', '[': ']', '{': '}'}
        stacked = []
        for i in range(len_s):

            # 如果符号为左括号进行压栈
            if s[i] in str_dict.keys():
                stacked.append(s[i])

            # 如果栈不为空且符号在右括号内且左符号和最后一个元素相等
            if stacked and s[i] in str_dict.values() and s[i] == str_dict[stacked[-1]]:
                stacked.pop()
        if stacked == []:
            return True
        else:
            return False


solution = Solution()
print(solution.isValid("{[]}"))  # True
print(solution.isValid("{[[}"))  # False

示例:给定一个数组 T 代表了未来几天里每天的温度值,要求返回一个新的数组 D,D 中的每个元素表示需要经过多少天才能等来温度的升高。

给定 T:[23, 25, 21, 19, 22, 26, 23]

返回 D:  [  1,   4,   2,   1,   1,   0,   0]

class Solution(object):
    def dailyTemperatures(self, T):
        """
        :type T: List[int]
        :rtype: List[int]
        """
        stack = list()
        t_length = len(T)
        res_list = [0 for _ in range(t_length)]
        
        for key, value in enumerate(T):     
            if stack:
                while stack and T[stack[-1]] < value:
                    res_list[stack[-1]] = key - stack[-1]
                    stack.pop()
            stack.append(key)
        return res_list
原文地址:https://www.cnblogs.com/zhaoyingjie/p/13997316.html