在Python中,列表(list)是一种基本的数据结构,它可以存储一系列的元素。列表是可变的,即可以对其进行增删改查操作。
栈(Stack)是一种具有特定限制的线性数据结构,在栈中,添加和删除元素只能在一端进行操作,这一端被称为栈顶。栈的特点是先进后出(LIFO,Last-In-First-Out),即最后进栈的元素最先出栈。
队列(Queue)也是一种线性数据结构,与栈不同的是,队列的元素从一端插入(称为队尾),从另一端删除(称为队首)。队列的特点是先进先出(FIFO,First-In-First-Out),即最先进入队列的元素最先出队列。
在Python中,可以使用列表来实现栈和队列的功能。
以上是基于列表的简单实现,实际上,Python提供了更高效的数据结构来实现栈和队列,分别是collections.deque(双向队列)
和queue.Queue
。
目录
数据结构:
列表:
栈:
基本代码
括号匹配问题:
队列
队列的实现:环形队列
队列的内置模块
双向队列 单向队列
类似于linux的tail命令
数据结构:
物理结构和逻辑结构
列表:
列表中的元素是怎么存储的:顺序存储。(一块连续的内存)
基本操作的时间复杂度:
a[2]:O(1)
append():O(1)
insert() remove() pop() :O(n)
数组和列表有两点不同:
-
数组的类型是相同的
-
数组长度固定
Python的列表是如何实现的?
栈:
基本代码
# 栈 封装成一个类
class Stack:
def __init__(self):
self.stack = []
def push(self,element):
self.stack.append(element)
def pop(self):
return self.stack.pop()
def get_top(self):
if len(self.stack) > 0:
return self.stack[-1]
else:
return None
stack = Stack()
stack.push(0)
stack.push(1)
stack.push(2)
print(stack.pop())
括号匹配问题:
# 匹配问题
'''
string = input()
stack = []
match = {'}':'{',')':'(',']':'['}
for char in string:
if char in {'(','{','['}: # 集合
stack.append(char)
else:
if len(stack) == 0 or stack.pop() != match[char]:
print('False')
break
if len(stack) == 0:
print('True')
'''
队列
队列的实现:环形队列
class Queue:
def __init__(self,size = 100):
self.queue = [0 for _ in range(size)]
self.size = size
self.rear = 0 # 队尾指针
self.front = 0 # 队首指针
def push(self,element):
if not self.is_filled():
self.rear = (self.rear + 1) % self.size
self.queue[self.rear] = element
else:
raise IndexError("queue is filled.")
def pop(self):
if not self.is_empty():
self.front = (self.front + 1) % self.size
return self.queue[self.front]
else:
raise IndexError("Queue is empty.")
# 判断队空
def is_empty(self):
return self.rear == self.front
# 判断队满
def is_filled(self):
return (self.rear+1) % self.size == self.front
q = Queue(5)
# 长度是5,只能存储4个数
q.push(4)
q.push(6)
q.push(5)
q.push(6)
print(q.pop())
队列的内置模块
双向队列 单向队列
# 队列内置模块
from collections import deque
q = deque([1,2,3,4],5) # 第二个可选参数 5 代表最长长度如果队满直接默认队首出队
#单向
q.append(1) # 队尾进队
print(q.popleft()) # 队首出队
# 双向队列
# q.appendleft(1) # 队首进队
# q.pop() # 队尾出队
类似于linux的tail命令
取后n个
from collections import deque
def tail(n):
with open('test.txt','r') as f:
q = deque(f,n)
return q
print(tail(5))
以上是基于列表的简单实现,实际上,Python提供了更高效的数据结构来实现栈和队列,分别是collections.deque
和queue.Queue(多线程安全队列)
。