特点:栈的最大特点就是后进先出(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