数据结构
关于数据结构,我的建议是先从大话数据看起,了解基本的算法,从c语言了解再延伸到其他语言上,因为数据结构核心是算法,了解核心,再到其他语言就容易很多,再要加以灵活运用,可以到力扣上刷题(但适合有一定算法基础的人),小白的话可以先去牛客刷一下,对新手比较友好。接下来是从python角度下讲解基本数据结构。
1、把列表当做栈
在 Python 中,可以使用列表(list)来实现栈的功能。栈是一种后进先出(LIFO, Last-In-First-Out)数据结构,意味着最后添加的元素最先被移除。列表提供了一些方法,使其非常适合用于栈操作,特别是 append() 和 pop() 方法。
用 append() 方法可以把一个元素添加到栈顶,用不指定索引的 pop() 方法可以把一个元素从栈顶释放出来。
栈操作
-
压入(Push): 将一个元素添加到栈的顶端。
-
弹出(Pop): 移除并返回栈顶元素。
-
查看栈顶元素(Peek/Top): 返回栈顶元素而不移除它。
-
检查是否为空(IsEmpty): 检查栈是否为空。
-
获取栈的大小(Size): 获取栈中元素的数量。
#1、创建空栈
stack = []
#2、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]
#查看栈顶元素
直接访问列表的最后一个元素(不移除):
size = len(stack)
print(size) # 输出: 2
综合例子:
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
2、将列表当作队列使用
在 Python 中,列表(list)可以用作队列(queue),但由于列表的特点,直接使用列表来实现队列并不是最优的选择。
队列是一种先进先出(FIFO, First-In-First-Out)的数据结构,意味着最早添加的元素最先被移除。
使用列表时,如果频繁地在列表的开头插入或删除元素,性能会受到影响,因为这些操作的时间复杂度是 O(n)。为了解决这个问题,Python 提供了 collections.deque,它是双端队列,可以在两端高效地添加和删除元素。
使用 collections.deque 实现队列
collections.deque 是 Python 标准库的一部分,非常适合用于实现队列。
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) # 输出: 队列是否为空: False
# 获取队列大小
size = len(queue)
print("队列大小:", size) # 输出: 队列大小: 2
这个还没涉及有关更深的算法,只是了解了栈和队列在python角度下的运用,再之后的,我会在后续博客上发布的。