基于Python3的数据结构与算法 - 14 队列

目录

一、定义

1. 环形队列

2. 自定义队列

二、队列的内置模块 

1. 双向队列


一、定义

  1. 队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
  2. 进行插入的一端称为队尾(rear),插入动作称为进队或入队
  3. 进行删除的一端称为队头(front),删除动作称为出队
  4. 队列的性质:先进先出(First-in, First-out)。

队列也可以使用列表来实现:

但是这种情况下会出现一个问题:若我们采用pop(下标来进行出队),此时操作上时间复杂度为为O(n),而且在情况(d)下,此时如果我们还需要入栈,只能在后面的空间上,前面的空间会造成浪费,因此我们引入环形队列。 可以到最后从头到尾接起来。

1. 环形队列

定义:当队尾指针front == Maxsize - 1时, 再前进一个位置就自动到0. 

  • 队首指针前进1:front = (front + 1)% MaxSize
  • 队尾指针前进1:rear = (rear + 1)% MaxSize
  • 队空条件:rear == front
  • 队满条件:(rear + 1) % MaxSize == front

对满的情况少1格是为了防止与空队列的情况相同。

2. 自定义队列

我们可以通过自己创建一个类来实现队列的功能,示例代码如下:

class Queue:
    def __init__(self, size = 100):   # 创建一个大小为100的列表
        self.queue = [0 for _ in range(size)]
        self.size = size
        self.rear = 0   # 队尾 = 0
        self.front = 0   #队首 = 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

二、队列的内置模块 

1. 双向队列

双向队列的两端都支持进队和出队的操作。

双向队列的基本操作:

  • 队首进队
  • 对手出队
  • 队尾进队
  • 队尾出队

这个队列与多线程中的队列不一样。是一种特殊的数据结构。

  • 使用方法:
from collections import deque
  • 创建队列: queue = deque()
  • 进队:append()
  • 出队:popleft()
  • 双向队列队首进队:appendlleft()
  • 双向队列队尾出队:pop() 

实例:

如果我们需要打印一个文件的后几行,可以使用队列

from collections import deque

# q = deque([1, 2, 3, 4, 5],5)
def tail(n):  # n表示打印几行
    with open('test.txt', 'r') as f:
        q = deque(f, n)  # f表示读取的内容,n表示最大队列的范围  # 每次读取一个f
        return q  


# deque的特性:当队满时,此时再进队会自动使得第一位的元素出队
for line in tail(5):
    print(line, end='')

实现思路:我们设置n = 5,那么当我们把整个数据传入列表中时。队列满出来,使得前面的数据自动出队,最后只剩下最后的5行元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一道秘制的小菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值