Python栈、队列、串

一、栈(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"

串的应用场景

  • 文本处理
  • 数据清洗
  • 模式匹配
  • 密码学算法
### 队列练习题解析 在 Python 中,(Stack)和队列(Queue)是常见的数据结构,它们可以通过不同的方式实现。以下是一些与队列相关的练习题及其解析。 #### 1. 使用列表实现 Python 的 `list` 可以很方便地用来实现。`append()` 方法可以用于压操作,而 `pop()` 方法则可以用于弹出顶元素。 ```python stack = [] # 压 stack.append(1) stack.append(2) stack.append(3) # 弹出顶元素 print(stack.pop()) # 输出: 3 print(stack.pop()) # 输出: 2 ``` #### 2. 使用 collections.deque 实现队列 对于队列来说,使用 `collections.deque` 是一个很好的选择,因为它支持在两端高效地插入和删除元素。 ```python from collections import deque queue = deque() # 入队 queue.append(1) queue.append(2) queue.append(3) # 出队 print(queue.popleft()) # 输出: 1 print(queue.popleft()) # 输出: 2 ``` #### 3. 使用 queue.Queue 类实现线程安全的队列 在多线程环境中,可以使用 `queue.Queue` 来确保线程安全的操作。 ```python from queue import Queue q = Queue() # 入队 q.put(1) q.put(2) q.put(3) # 出队 print(q.get()) # 输出: 1 print(q.get()) # 输出: 2 ``` #### 4. 实现一个最小 设计一个支持 push、pop、top 和 getMin 操作的最小。 ```python class MinStack: def __init__(self): self.stack = [] self.min_stack = [] def push(self, x): self.stack.append(x) if not self.min_stack or x <= self.min_stack[-1]: self.min_stack.append(x) def pop(self): if self.stack[-1] == self.min_stack[-1]: self.min_stack.pop() return self.stack.pop() def top(self): return self.stack[-1] def getMin(self): return self.min_stack[-1] ``` #### 5. 判断括号是否匹配 编写一个函数来判断字符中的括号是否匹配。 ```python def is_valid(s): stack = [] mapping = {")": "(", "}": "{", "]": "["} for char in s: if char in mapping.values(): stack.append(char) elif char in mapping: if not stack or mapping[char] != stack.pop(): return False else: continue return not stack # 测试 print(is_valid("()[]{}")) # 输出: True print(is_valid("([)]")) # 输出: False ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值