首页 > 编程语言 >python初步了解队列

python初步了解队列

时间:2022-12-08 10:57:31浏览次数:39  
标签:python self print 初步 队列 rear front def

python初步了解队列

队列

是一种先入先出的数据结构

单纯用列表来实现队列运用pop()函数,进行出队效率很低,因为在列表开头删除元素需要将其他元素往前移动一位.

所以一般用其他方法实现队列。实现队列一般使用两个指针分别指向前端和后端,

便于删除和添加元素。

在使用队列时一般使用循环队列以避免浪费空间。

循环队列要实现以下几点

(1)入队

(2)出队

(3)判断是否为空队列

(4)判断队列是否已满

(5)返回队列前端和后端的值

数组实现(顺序队列)

数组实现队列要先创建固定队列长度,以此来创建一个列表,front和rear分别对应队列前端和后端的索引位置。由于rear所对应的后端要超出队列一个元素,所以设计时应当时列表比给出的长度多一格,以避免程序报错。

class Queue:
    def __init__(self,size):        #设置队列
        self.size = size + 1          
        self.queue = [0] * self.size  #生成队列
        self.front = self.rear = 0    #设置指针

    def enqueue(self,data):           #入队
        if self.isfull():             
            print("队列已满")
        else:
            self.queue[self.rear] = data
            self.rear = (self.rear + 1) % self.size

    def dequeue(self):               #出队
        if self.isempty():
            print("队列为空")
        else:
            self.front = (self.front + 1) % self.size

    def isempty(self):         #判断是否为空
        return self.front == self.rear

    def isfull(self):          #判断是否已满
        return (self.rear + 1) % self.size == self.front

    def frontitem(self):       #输出队头
        if self.isempty():
            print("队列为空")
        else:
            print(self.queue[self.front])

    def rearitem(self):       #输出队尾
        if self.isempty():
            print("队列为空")
        else:
            print(self.queue[(self.rear - 1 + self.size)] % self.size)% self.size

重点在于对指针的循环操作。两个指针不断移动表示队列的长度,当指针所对应的下标超过列表长度时,做循环处理,即让指针再次从下标为0出开始循环。

链表实现(链式队列)

使用链表实现更加简单,由于要动态创建和删除节点,效率较低,但是优点在于可以动态增长。

class Node:     #设置节点
    def __init__(self,data = None,next = None):
        self.data = data
        self.next = next

class Queue:      #设置队列
    def __init__(self,head = Node()):   #引入头节点
        self.front = self.rear = head  #设置前端和后端

    def enqueue(self,data):    #引入新元素
        self.new = Node(data)  #创建新元素的节点
        self.rear.next = self.new  #使后端的next指向新节点
        self.rear = self.new       #让新阶段成为后端

    def dequeue(self):         #删除节点
        if self.isempty():
            print("队列为空")
        else:
            self.front = self.front.next    #将前端指向原前端的next

    def isempty(self):
        return self.front == self.rear

    def frontitem(self):
        if self.isempty():
            print("队列为空")
        else:
            print(self.front.data)

    def rearitem(self):
        if self.isempty():
            print("队列为空")
        else:
            print(self.rear.data)
deque()

python3的官方文档中有介绍实现队列的方法,运用collection.deque来实现,可以快速从两端添加和删除元素。

如下:

from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry")          
queue.append("Graham")       
queue.popleft()                 
#'Eric'
queue.popleft()            
#'John'
queue                      
#deque(['Michael', 'Terry', 'Graham'])

十分的简便。

标签:python,self,print,初步,队列,rear,front,def
From: https://www.cnblogs.com/102204216zxf/p/16965457.html

相关文章

  • python浅拷贝和深拷贝
    python浅拷贝和深拷贝python中对对象直接赋值其实只是将其换了一个名字,想要对对象进行真正的复制要通过别的方法。浅拷贝浅拷贝利用copy()函数就可以实现,它会产生新的对......
  • java-net-php-python-s2s酒店管理系统计算机毕业设计程序
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • Python中glob类的使用
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • Python3 多线程并发处理的返回值收集
    库函数threading背景去查询python3多线程,可以找到一大堆关于threading库的博客教程,但是多数是几个线程执行同一个函数(他们博客里各个线程传入的函数参数不同),且没有......
  • python中socke套接字的应用
    socket:问题一:什么是socketsocket(简称套接字)是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服......
  • Centos 7 + python3 + paramiko + netmiko 安装
    转载自 (31条消息)Centos7下安装Python3并通过Pip安装Paramiko与Netmiko_筐瓢大师小吕的博客-CSDN博客             ......
  • 关于解决pip安装python第三方库超时的问题
    直接换源下载1.设置超时时间,安装txt文件内安装包pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple--default-timeout=1000-rpackages.txt2.指定源安装,推......
  • python requests.cookies.RequestsCookieJar()
    使用python的requests开发爬虫类程序时,经常需要将之前请求返回的set-cookie值,作为下一个请求的cookie发送。比如模拟登录之后的返回的sessionId,就需要作为后续请求的cookie......
  • 名师课堂|Python基础教程 2 变量与数据类型
    学习目标注释的分类及语法变量的作用定义变量认识数据类型一、注释的分类注释最大的作用,是能够增强程序的可读性在Python中,注释分为两类:单选注释和多行注释1.单行注释只能......
  • python中的函数进阶
    1.局部变量和全局变量在函数外定义的不可变数据类型,在函数里面是可读不可写在函数外定义的可变数据类型,在函数里面可读可写不可变类型传入函数,进行的操作不会影响到外面的......