python数据结构学习日记【队列】

文章介绍了队列的基本概念,遵循先进先出(FIFO)原则,并展示了如何使用Python列表实现队列操作。接着,文章探讨了循环队列的概念,解释了如何在满队列时扩展空间,并给出了Python代码示例。最后提到了Python内置的`queue`库及其基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列(Queue)

一、概述
队列只允许表的一端(队尾rear)入队,并在另一端(队头front)出队。这与日常排队是类似的,遵守先进先出(FIFO:First In First Out)的原则,规则如下图所示
在这里插入图片描述
二、队列的基本操作
Q.enqueue(e):向队尾添加一个元素e
Q.dequeue():从队列中移除并返回第一个元素,如果队列空,则error
Q.first():在不移除的前提下,返回队列的第一个元素,若队空,则error
Q.is_empty():若队列中不含有任何元素,则返回 布尔值TRUE
Q.len():返回队列中的元素的个数,也称为队列的长度

使用python实现以上操作:
若已有一个列表(List)L,则:

队列操作python实现
Q.enqueue(e)L.append(e)
Q.dequeue()L.pop(0)
Q.first()L[0]
Q.is_empty()len(L)==0
Q.len()len(Q)

用python实现:

class Queue:
    def __init__(self,):
        self._data=[]

    def Que_in(self,e):
        self._data.append(e)

    def Que_out(self):
        return self._data.pop(0)

    def Que_first(self):
        return self._data[0]

    def Que_isEmpty(self):
        return len(self._data)==0

    def Que_len(self):
        return len(self._data)


Queue1=Queue()
print(Queue1.Que_isEmpty())
Queue1.Que_in('J')
Queue1.Que_in('a')
Queue1.Que_in('v')
Queue1.Que_in('A')
print(Queue1.Que_isEmpty())
print(Queue1.Que_first())
print(Queue1.Que_len())
Queue1.Que_out()
print(Queue1.Que_first())
print(Queue1.Que_len())

运行结果如下:
在这里插入图片描述

三、循环队列
将顺序队列臆造为一个环状的空间,把存储队列元素的表从逻辑上视为一个环。新的元素依然在队尾入队,假设数组的固定长度(总容量)为n,第一个元素索引为f,逐渐将元素从队列的前面插入索引为n-1的位置。如下图所示
在删除元素并且更新索引时,可以用 f=(f+1)%N来进行更新。(%为取模运算,即整数除法后取余数的值)
例如队列的固定长度为7(总的可以放下7个元素),队头在索引为2 的地方,此时让队头元素出队,则(2+1)%7=3,队头更新为索引为3。

在添加元素时,使用 **r=(f+Q.size)%len(Q)**来更新队尾索引,其中r为队尾的索引,f是队头的索引,Q.size表示当前队列里有几个元素,len(Q)表示队列的总容量或者说固定长度。例如,固定长度为7的队列,队尾当前在4,队头当前在6,此时向队尾添加一个元素,则(6+7)%7=6,即队尾索引更新为6。
用python来实现:

class Queue:
    def __init__(self,):
        self._data=[None]*10
        self._size=0
        self._front=0

    def Que_in(self,e):
        if self._size==len(self._data):
            self.resize(2*len(self._data))
        rearNum=(self._front+self._size)%len(self._data)
        self._data[rearNum]=e
        self._size+=1

    def resize(self,num):
        old=self._data
        self._data=[None]*num
        walk=self._front
        for k in range(self._size):
            self._data[k]=old[walk]
            walk=(1+walk)%len(old)
        self._front=0


    def Que_out(self):
        if self.Que_isEmpty()==True:
            print('the Q is empty')
        result=self._data[self._front]
        self._data[self._front]=None
        self._front=(self._front+1)%len(self._data)
        self._size-=1
        return result

        return self._data.pop(0)

    def Que_first(self):
        return self._data[self._front]

    def Que_isEmpty(self):
        return len(self._data)==0

    def Que_size(self):
        return self._size

    def Que_len(self):
        return len(self._data)


Queue1=Queue()
print(Queue1.Que_isEmpty())
Queue1.Que_in('p')
Queue1.Que_in('y')
Queue1.Que_in('t')
Queue1.Que_in('h')
Queue1.Que_in('o')
Queue1.Que_in('n')
Queue1.Que_in('c')
Queue1.Que_in('C++')
Queue1.Que_out()
Queue1.Que_out()
Queue1.Que_out()
Queue1.Que_in('C#')
#Queue1.Que_in('Java')
print(Queue1.Que_first())
print(Queue1.Que_size())

四、python 中提供了相应的queue库
基本用法如下:

import queue#导入队列库
q=queue.Queue()#创建队列对象
q.put(1)#在队尾插入元素
q.put(2)#继续在队尾插入无元素
print(q.queue)#查看队列
n=q.get()#删除并返回删除的队头元素
print(n)
print(q.queue)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值