队列及队列内置模块

队列

  • 队列(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
# 阿德撒旦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Weidong He.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值