数据结构之栈

发布时间 2023-09-14 23:58:24作者: Allen_Hao

1. 什么是栈?

栈是一种常见的数据结构,它遵循先进后出(LIFO)的原则。栈可以用来解决很多实际问题,比如函数调用、表达式求值、括号匹配等。

2. 特点

  • 栈是一种线性数据结构,由一系列元素组成。
  • 栈的插入和删除操作只能在栈的顶部进行。
  • 栈的顶部元素是最后一个插入的元素,也是唯一可以访问的元素。

3. 操作

栈支持以下几种操作:

  • Push:将元素插入到栈的顶部。
  • Pop:将栈顶部的元素删除,并返回该元素的值。
  • Peek:返回栈顶部元素的值,但不删除该元素。
  • isEmpty:检查栈是否为空。
  • size:返回栈中元素的个数。

 

4. 最佳实践

在使用栈的时候,有一些最佳实践可以帮助我们更好地利用它:

  • 在使用栈之前,先确定栈的大小,以避免栈溢出的问题。
  • 使用异常处理机制来处理栈溢出的情况。
  • 在进行复杂的操作时,可以使用多个栈来简化问题。

 

5. 坑

在使用栈的过程中,有一些常见的坑需要注意:

  • 忘记检查栈是否为空就进行 Pop 操作,可能会导致栈溢出异常。
  • 没有正确处理运算符的优先级,可能会导致表达式求值结果错误。
  • 在使用栈求解问题时,需要确保栈中元素的顺序和操作的顺序一致,否则可能会得到错误的结果。

 

6. 示例

6.1 计算表达式的值

 

 1 '''
 2 1. 题目: 栈是一个非常常用的数据结构,可以用来实现括号匹配。括号匹配是指检查一个字符串中的括号是否正确配对。
 3 
 4 2. 实现思路
 5     1. 遍历字符串中的每个字符。
 6     2. 如果遇到左括号(如'('、'['、'{'),则将其压入栈中。
 7     3. 如果遇到右括号(如')'、']'、'}'),则检查栈顶部的元素。
 8         1. 如果栈为空或栈顶部的元素与当前右括号不匹配,则括号不匹配,返回 False。
 9         2. 如果栈顶部的元素与当前右括号匹配,则将栈顶部的元素弹出。
10     4. 遍历完字符串后,检查栈是否为空。
11         1. 如果栈为空,则括号匹配,返回 True。
12         2. 如果栈不为空,则括号不匹配,返回 False。
13 
14 '''
15 
16 
17 def is_valid_parentheses(s):
18     if not (len(s) % 2 == 0 and len(s) > 0):  # 判断是否可以数量上是否满足
19         return False
20 
21     stack = []  # 列表实现栈
22     # 特点,匹配后半部分为key,前半部分为value(这样入栈只能是前半部分,总之栈里的元素与字典的key匹配,与字典的value相等)。
23     # 与栈顶元素比较是否匹配,匹配继续遍历,不匹配直接返回False
24     mapping = {')': '(', ']': '[', '}': '{'}
25     for char in s:
26         if char in mapping:
27             if not stack or stack.pop() != mapping[char]:
28                 return False
29         else:
30             stack.append(char)
31     return not stack
32 
33 
34 s = "([{}])"
35 print(is_valid_parentheses(s))  # 输出结果为 True
36 
37 s = "([{}]))"
38 print(is_valid_parentheses(s))  # 输出结果为 False