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

python初步了解队列

时间:2022-12-09 17:58:36浏览次数:34  
标签: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/16969611.html

相关文章

  • python初步了解链表
    python数据结构——链表链表由一个个节点组成,每个节点包含自己的存储数据和下一个节点。单链表简单实现先创造一个类来表示节点与节点之间的关系classNode:def......
  • python初步了解栈
    python初步了解栈栈栈是一种后入先出的数据结构。python用列表实现堆栈非常容易,使用append函数,即可实现堆栈,pop()函数即可实现从栈顶取出元素。stack=[3,4,5]stac......
  • python序列
    python序列序列包括字符串,元组,列表序列的操作在三者中都适用,同时三者存在特定的操作操作符操作作用ain/notins判断元素是否在序列中s+t连接两个序......
  • python元组
    python元组元组具体格式如下:a=(1,2)以上两个都是元组,但是一般为了易读和方便,一般使用带小括号的方式。元组的创建:a=()x=tuple()print(type(a))print(type(x......
  • python字符串
    python学习字符串处理方法1.大小写转换函数作用str.lower()全小写str.upper()全大写str.capitalize()第一个字符大写str.swapcase()大写转小写,小......
  • python集合
    python集合集合同dict类似也由{}表示,但是他只包含键,而没有对应的值,同时元素也不能重复集合的创建只能用set():a=set()print(type(a))#<class'set'>内置方法(1)se......
  • python字典
    python字典字典由key和value组成,一个key对应一个value,且key不能重复,这样我们能通过key来访问value。我们可以通过以下两中方式创建一个空字典dic1={}dic2=dict()......
  • python列表
    列表的运用1.减少元素(1)dells[]place=['lasa','chengdu','litang','xian','lundon']delplace[0]#输出['chengdu','litang','xian','lundon']还可以删......
  • python推导式
    python推导式推导式是用一行式子来完成循环操作的语句,一般与for循环结合来使用。列表推导式公式[exprforvalueincollection[ifcondition]]例子对循环内元素......
  • python浅拷贝和深拷贝
    python浅拷贝和深拷贝python中对对象直接赋值其实只是将其换了一个名字,想要对对象进行真正的复制要通过别的方法。浅拷贝浅拷贝利用copy()函数就可以实现,它会产生新的对......