zl程序教程

您现在的位置是:首页 >  后端

当前栏目

[Python]队列---双向队列实现介绍及应用

Python应用队列队列 实现 介绍 --- 双向
2023-09-11 14:22:09 时间

队列:

队列分为:普通队列、环形队列、双向队列

双向队列

定义:
两端都可以做进队与出队操作

操作:

队首进队
队首出队
队尾进队
队尾出队

在这里插入图片描述
双向队列在python现成的模块使用collections下面的deque

新建一个空队列

from collections import deque

dq = deque()
dq.append(1) #队首进队
print(dq.popleft()) #队首出队 
print(dq.popleft()) #IndexError: pop from an empty deque

新建一个有值队列

# 新建一个有值队列
dq = deque([1,2,3])
dq.append(1) #队首进队
print(dq.popleft()) #队首出队 1
print(dq.popleft()) #2

新建一个有值队列,并设置长度,如果队满仍有值进入,冲掉原来的值

# 新建一个有值队列,并设置长度,如果队满仍有值进入,冲掉原来的值
dq = deque([1, 2, 3, 4, 5], 5)
print(dq)
dq.append(6)  # 队首进队
print(dq)

print(dq.popleft())  # 2
print(dq.popleft())  # 3

打印结果:

deque([1, 2, 3, 4, 5], maxlen=5)
deque([2, 3, 4, 5, 6], maxlen=5)
2
3

可以看出在6进入队列之前,队列中有[1, 2, 3, 4, 5]5个元素,并且maxlen也是5,在6进入到队列后,原来位于开头的1因空间只有5个长度而被挤掉,现在的结果是[2, 3, 4, 5, 6],并且maxlen还是5,所以在后面两步dq.popleft()的时候分别取出的值的2、3;

应用场景:

日志查看

在linux系统中我们经常使用tail,命令进行显示指定文件末尾几行,这里我们借助双向队列实现这个功能;
在实现之前需要提前准备一个模拟日志文件,我在这里准备了一个test.txt文件,里面象征性的放置一些便于区分的文字, 比如每行的数据就是行号:在这里插入图片描述
代码实现:

def tail(n):
    with open('test.txt','r') as f:
        a = deque(f,n)
        print(a)
        return a
#打印后5行日志
for i in tail(5):
    print(i)

结果展示:因每行末尾有个换行符,python在做文件读取操作的时候没做处理,原义转换成了换行符:
在这里插入图片描述
这样就简单实现了tail的功能;