队列
- 队列(Queue) 是一个数据集合,仅允许在列表的一段进行插入,另一端进行删除
- 进行插入的一端称为队尾(rear),插入动作称为进队或入队
- 进行删除的一端称为队头(front),删除动作称为出队
- 队列的性质: 先进先出
#队首指针先不动,有数据加入时队尾指针变大,当有数据出队时,队首指针向着队尾的指针追赶,
#所以两指针都是向着变大在变化,当达到100时,也就是尾部,变为0,也就是初始的地方
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):
#在队不满的时候
#当末尾和首连接的部分进行变化时,只能用余数的形式,所以整体用余数的形式来表示,rear % 100,只能得到0-99,每次调用push,rear都会加1
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 + 1) % self.size == (self.front + 1) % self.size
#判断队满
def is_filled(self):
return (self.rear + 1) % self.size == self.front
q = Queue()
for i in range(99):
q.push(i)
print(q.is_empty())
print(q.is_filled())
print(q.pop())
print(q.is_filled())
print(q.pop())
#False
#True
#0
#False
#1
内置模块
from collections import deque
#不传东西默认是空的队列,第二个参数时限制队列的大小,如果传入的数据大于限制的大小,队首默认出队给后面让位置
q = deque([1,2,3,4,5],5)
q.append(6) #队尾进队
q.popleft() #队首出队
#双向队列
q.appendleft(10) #队首进队
q.pop() #队尾出队
print(q)
#deque([10, 3, 4, 5], maxlen=5)
*小例子*
#deque 限制只能保留n个值,后面的会将前面的顶出去,最后只剩下最后n个
def tail(n):
with open('队列.txt','r',encoding='utf-8') as f:
q = deque(f,n)
return q
h = tail(5)
for i in h:
print(i)
# 是个十分
# 士大夫
# 算法师安抚安抚
# afa
# 阿德撒旦