一、堆

#首先导入heapq库
help(heapq)#首先学会使用帮助文档
import heapq
import random

#堆中的元素是存储在列表里面的
#创建堆有两种方法

#建堆方法一:逐个创建
data = list(range(10))
#随机选取一个列表中的元素
print(random.choice(data))
#随机打乱顺序
print(random.shuffle(data))
#建堆
aheap = []
for i in data:
    heapq.heappush(aheap,n)
#原则:入堆自动重建,出堆自动重建
heapq.heappush(aheap,0.5)
heapq.heappop(aheap,0)

#建堆方法二:
myheap = [1,2,3,4,5,6,7,8,9]
heapq.heapify(myheap)
#弹出最小元素,同时插入新元素
heapq.replace(myheap,6)
#返回前n个最大的元素
heapq.nlargest(n,myheap)
#返回前n个最小的元素
heapq.nsmallest(n,myheaq)

 

 

二、队列

#python提供了4种队列


#可以用列表来模拟队列结构
x = [1,2,3,4]
x.append(5)#向队尾即列表尾部添加元素
x.pop(0)#删除队头即列表头部元素,若队列为空则会抛出异常


#队列种类1:先进先出LILO
from queue import Queue
q = Queue()#创建队列对象
q.put(0)
q.put(1)#在队列尾部插入元素
q.get()#返回并删除队列头部元素
print(q.queue)#查看队列中所有元素,注意,这里的方法后面没有括号
#输出:deque([0, 1, 2, 3, 4, 5, 6])


#队列种类2:后进先出LIFO
from queue import LifoQueue
q = LifoQueue()#创建队列对象
q.put(0)
q.put(1)#在队列尾部插入元素
q.get()#返回并删除队列尾部元素,如果对空队列调用,会阻碍当前的线程
print(q.queue)#查看队列中所有元素,注意,这里的方法后面没有括号


#队列种类3:优先级队列
from queue import PriorityQueue
q = PriorityQueue()#创建优先级队列对象
q.put(0) 
q.put(1)#插入元素
q.get()#返回并删除优先级最低的元素
q.put(1)#插入元素,自动调整优先队列,可以多执行几次并观察返回的数据
print(q.queue)#查看队列中所有元素

#队列种类4:双端队列
from collections import deque
q = deque(maxlen=5)#创建一个长度为5的双端队列
for item in [3,5,7,9,11]:#添加元素
    q.append(item)
q.append(34)#队列满,左侧溢出
q.appendleft(45)#从左侧添加元素,从右边溢出
#注意,这里没有从右侧添加元素,从左边溢出q.appenright(44)的方法
q.pop()#相当于q.popleft()从左侧移除元素

 

 

三、栈

#栈是一种“后进先出(LIFO)”或者“先进后出(FILO)”的数据结构
#列表对象的append()方法是在列表尾部追加元素,pop()方法是弹出并返回列表最后一个元素,这跟入栈出栈很像,但是直接用列表来实现栈不是最完美的
myStack = []
myStack.append(3)#[3,]
myStack.append(5)#[3,5]
myStack.pop()#[3,]
myStack.pop()#[]
myStack.pop()#出错