一、栈(Stack)
栈是一种后进先出(LIFO)的线性数据结构,只允许在一端(称为栈顶)进行插入和删除操作。
1、使用列表实现栈
stack = [] # 创建一个空栈
# 入栈操作 - O(1)
stack.append(10) # 栈: [10]
stack.append(20) # 栈: [10, 20]
stack.append(30) # 栈: [10, 20, 30]
# 出栈操作 - O(1)
print(stack.pop()) # 输出: 30, 栈: [10, 20]
print(stack.pop()) # 输出: 20, 栈: [10]
# 查看栈顶元素 - O(1)
print(stack[-1]) # 输出: 10
# 判断栈是否为空
print(len(stack) == 0) # 输出: False
2、使用deque实现栈(更高效)
from collections import deque
stack = deque() # 创建栈
# 入栈
stack.append(1) # 栈: [1]
stack.append(2) # 栈: [1, 2]
# 出栈
print(stack.pop()) # 输出: 2
栈的应用场景:
- 函数调用栈
- 表达式求值
- 括号匹配检查
- 浏览器的前进/后退功能
二、队列(Queue)
队列是一种先进先出(FIFO)的线性数据结构,在一端(队尾)插入,在另一端(队首)删除。
1、列表实现队列(不推荐)
queue = [] # 创建队列
# 入队 - O(1)
queue.append(10) # 队列: [10]
queue.append(20) # 队列: [10, 20]
# 出队 - O(n)(效率低,因为要移动所有元素)
print(queue.pop(0)) # 输出: 10, 队列: [20]
2、使用deque实现队列(推荐)
from collections import deque
queue = deque() # 创建队列
# 入队 - O(1)
queue.append(10) # 队列: [10]
queue.append(20) # 队列: [10, 20]
# 出队 - O(1)
print(queue.popleft()) # 输出: 10, 队列: [20]
print(queue.popleft()) # 输出: 20, 队列: []
print(queue) # 输出:deque([])
3、优先队里(PriorityQueue)
from queue import PriorityQueue
pq = PriorityQueue()
# 插入元素 (自动排序)
pq.put((3, "低优先级"))
pq.put((1, "高优先级"))
pq.put((2, "中优先级"))
# 获取元素 (按优先级)
print(pq.get()) # 输出: (1, "高优先级")
print(pq.get()) # 输出: (2, "中优先级")
print(pq.qsize())# 输出:1
队列的应用场景
- 任务调度
- 消息队列
- 广度优先搜索(BFS)
- 打印机任务队列
三、串(String)
串是由零个或多个字符组成的有限序列,是编程中最常用的数据结构之一。
1、基本操作
s = "Hello, Python!"
# 长度 - O(1)
print(len(s)) # 输出: 14
# 索引访问 - O(1)
print(s[0]) # 输出: 'H'
print(s[-1]) # 输出: '!'
# 切片 - O(k) (k是切片长度)
print(s[7:13]) # 输出: 'Python'
2、常用方法
# 查找 - O(n)
print(s.find("Py")) # 输出: 7 (首次出现位置)
print(s.find("Java")) # 输出: -1 (未找到)
# 替换 - O(n)
print(s.replace("Python", "World")) # 输出: "Hello, World!"
# 分割 - O(n)
print(s.split(",")) # 输出: ['Hello', ' Python!']
# 连接 - O(n)
print("-".join(["a", "b", "c"])) # 输出: "a-b-c"
# 格式化
name = "Alice"
age = 25
print(f"{name} is {age} years old.") # 输出: "Alice is 25 years old."
3、字符串不可变性
s = "hello"
# s[0] = "H" # 会报错,字符串不可变
# 正确修改方式
s = "H" + s[1:] # 创建新字符串,或使用字符串的replece方法
print(s) # 输出: "Hello"
串的应用场景
- 文本处理
- 数据清洗
- 模式匹配
- 密码学算法