python数据结构总结
列表
列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。
将列表当做栈使用
可以使用列表(list)来实现栈的功能。栈是一种后进先出。最后添加的元素最先被移除。列表提供了一些方法,使其非常适合用于栈操作,特别是 append() 和 pop() 方法。
用 append() 方法可以把一个元素添加到栈顶,用不指定索引的 pop() 方法可以把一个元素从栈顶释放出来。
创建一个空栈:
stack = []
压入(Push)操作:
使用 append() 方法将元素添加到栈的顶端
stack.append(1)
stack.append(2)
stack.append(3)
print(stack) # 输出: [1, 2, 3]
弹出(Pop)操作:
使用 pop() 方法移除并返回栈顶元素
top_element = stack.pop()
print(top_element) # 输出: 3
print(stack) # 输出: [1, 2]
查看栈顶元素(Peek/Top):
直接访问列表的最后一个元素(不移除)
top_element = stack[-1]
print(top_element) # 输出: 2
检查是否为空(IsEmpty):
检查列表是否为空
is_empty = len(stack) == 0
print(is_empty) # 输出: False
获取栈的大小(Size):
使用 len() 函数获取栈中元素的数量
size = len(stack)
print(size) # 输出: 2
定义了一个 Stack 类,封装了列表作为底层数据结构,并实现了栈的基本操作:
class Stack:
def __init__(self):
self.stack = []
def push(self, item):
self.stack.append(item)
def pop(self):
if not self.is_empty():
return self.stack.pop()
else:
raise IndexError("pop from empty stack")
def peek(self):
if not self.is_empty():
return self.stack[-1]
else:
raise IndexError("peek from empty stack")
def is_empty(self):
return len(self.stack) == 0
def size(self):
return len(self.stack)
# 使用示例
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print("栈顶元素:", stack.peek()) # 输出: 栈顶元素: 3
print("栈大小:", stack.size()) # 输出: 栈大小: 3
print("弹出元素:", stack.pop()) # 输出: 弹出元素: 3
print("栈是否为空:", stack.is_empty()) # 输出: 栈是否为空: False
print("栈大小:", stack.size()) # 输出: 栈大小: 2
输出如下:
栈顶元素: 3
栈大小: 3
弹出元素: 3
栈是否为空: False
栈大小: 2
列表当作队列使用
列表(list)可以用作队列(queue),但由于列表的特点,直接使用列表来实现队列并不是最优的选择。
队列是一种先进先出,则最早添加的元素最先被移除。
使用列表时,如果频繁地在列表的开头插入或删除元素,性能会受到影响,因为这些操作的时间复杂度是 O(n)。为了解决这个问题,Python 提供了 collections.deque,它是双端队列,可以在两端高效地添加和删除元素。
使用 collections.deque 实现队列
from collections import deque
# 创建一个空队列
queue = deque()
# 向队尾添加元素
queue.append('a')
queue.append('b')
queue.append('c')
print("队列状态:", queue) # 输出: 队列状态: deque(['a', 'b', 'c'])
# 从队首移除元素
first_element = queue.popleft()
print("移除的元素:", first_element) # 输出: 移除的元素: a
print("队列状态:", queue) # 输出: 队列状态: deque(['b', 'c'])
# 查看队首元素(不移除)
front_element = queue[0]
print("队首元素:", front_element) # 输出: 队首元素: b
# 检查队列是否为空
is_empty = len(queue) == 0
print("队列是否为空:", is_empty)