Python 实现对列

本文详细介绍了队列这种基本的数据结构及其工作原理,包括队列的定义、特点和应用场景,并通过Python代码实现了一个简单的队列类,演示了队列的基本操作,如入队、出队、判断队列是否为空以及获取队列长度。

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

队列(queue)队列是先进先出(FIFO, First-In-First-Out)的线性表,在具体应用中通常用链表或者数组来实现,队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作,队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

如图所示


代码实现:

# coding = utf-8
class MyQueue(object):
    def __init__(self):
        # 构造空队列
        self._queue = []

    def enqueue(self, data):
        # 进队操作
        self._queue.insert(0, data)

    def outqueue(self):
        # 出队操作
        self._queue.pop()

    def is_empty(self):
        # 判空操作
        if len(self._queue) == 0:
            return True
        else:
            return False


    def size(self):
        # 队列长度
        return len(self._queue)

    def print1(self):
        # 输出队列
        print(self._queue)


if __name__ == "__main__":
    myq = MyQueue()
    print("原始队列:", end="")
    myq.print1()
    print("进队操作:")
    for i in range(10):
        myq.enqueue(i)
        myq.print1()

    print("出队操作:")
    for j in range(5):
        myq.outqueue()
        myq.print1()

    print("队列长度:{}".format(myq.size()))


程序输出结果:

原始队列:[]
进队操作:
[0]
[1, 0]
[2, 1, 0]
[3, 2, 1, 0]
[4, 3, 2, 1, 0]
[5, 4, 3, 2, 1, 0]
[6, 5, 4, 3, 2, 1, 0]
[7, 6, 5, 4, 3, 2, 1, 0]
[8, 7, 6, 5, 4, 3, 2, 1, 0]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
出队操作:
[9, 8, 7, 6, 5, 4, 3, 2, 1]
[9, 8, 7, 6, 5, 4, 3, 2]
[9, 8, 7, 6, 5, 4, 3]
[9, 8, 7, 6, 5, 4]
[9, 8, 7, 6, 5]
队列长度:5

<think>好的,我现在需要帮用户解决如何用Python实现队列数据结构的问题。首先,我得回忆一下队列的基本概念。队列是先进先出(FIFO)的结构,就像排队买票一样,先来的人先服务。用户可能已经知道这一点,但还是要简单提一下,确保基础正确。 接下来,我得看看用户提供的引用内容。引用1提到用表当作队列,但Python表在头部操作(比如pop(0)或insert(0, item))效率不高,因为需要移动所有元素。引用4和5展示了两种不同的实现方式,比如使用类来封装队列的操作,有的用双端队列,有的用单端。引用3提到了链式实现Python内置的Queue模块,这可能也是需要考虑的。 用户的问题是如何实现队列,所以需要给出几种不同的方法。首先,最基础的可能是用表,但需要指出效率问题。然后可以展示使用collections.deque,这是更高效的双端队列,适合频繁的插入和删除。另外,queue模块里的Queue类是多线程安全的,但如果是单线程的话可能没必要。还可以用链表来实现,这样在头部和尾部操作都是O(1)的时间复杂度。 需要分步骤讲解每种方法,并给出代码示例。比如实现的话,入队用append,出队用pop(0),但效率低。用deque的话,popleft()和append()就高效。链表实现可能稍微复杂一些,要定义节点类,维护头尾指针。 还要注意代码的正确性,比如判断队列是否为空,操作时的边界条件处理。比如在链表实现中,当队列为空时,出队操作要处理头尾指针都为None的情况。 用户可能对不同的实现方式的优缺点感兴趣,比如时间复杂度和适用场景。比如实现在数据量小的时候没问题,但数据量大时效率低;deque适合频繁操作;链表实现虽然灵活,但代码量稍大。 另外,用户提供的引用中有一些代码可能有误,比如引用4中的print my_stack.size()应该是queue.size(),需要检查示例代码的正确性,避免误导用户。 最后,总结各种方法的适用情况,帮助用户根据需求选择最合适的实现方式。可能还需要提到线程安全的需求,这时候应该用queue模块的Queue。</think>以下是Python实现队列数据结构的四种常用方法及详细说明: ### 一、使用实现基础队列(适合小数据量) ```python class ListQueue: def __init__(self): self.items = [] def enqueue(self, item): """入队操作 时间复杂度O(n)""" self.items.insert(0, item) def dequeue(self): """出队操作 时间复杂度O(1)""" return self.items.pop() if not self.is_empty() else None def is_empty(self): return len(self.items) == 0 def size(self): return len(self.items) ``` 特点:插入操作效率低(时间复杂度$O(n)$),适用于数据量小的场景[^4] ### 二、使用collections.deque实现高效队列 ```python from collections import deque class DequeQueue: def __init__(self): self.queue = deque() def enqueue(self, item): """入队操作 时间复杂度O(1)""" self.queue.append(item) def dequeue(self): """出队操作 时间复杂度O(1)""" return self.queue.popleft() if not self.is_empty() else None def is_empty(self): return len(self.queue) == 0 def size(self): return len(self.queue) ``` 特点:双端队列实现,所有操作时间复杂度均为$O(1)$,推荐作为首选方案[^2] ### 三、链表实现队列(面向对象设计) ```python class Node: def __init__(self, data): self.data = data self.next = None class LinkedQueue: def __init__(self): self.front = None self.rear = None def enqueue(self, item): new_node = Node(item) if self.rear is None: self.front = self.rear = new_node return self.rear.next = new_node self.rear = new_node def dequeue(self): if self.is_empty(): return None temp = self.front self.front = temp.next if self.front is None: self.rear = None return temp.data def is_empty(self): return self.front is None ``` 特点:内存动态分配,适合元素数量不固定的场景[^3] ### 四、使用queue模块(线程安全) ```python from queue import Queue # 创建最大容量为10的队列 q = Queue(maxsize=10) # 基本操作 q.put(1) # 入队 q.get() # 出队 q.empty() # 判空 q.qsize() # 队列大小 ``` 特点:线程安全实现,适用于多线程环境[^3] $$ \text{队列操作时间复杂度对比表} \\ \begin{array}{|c|c|c|} \hline \text{实现方式} & \text{入队} & \text{出队} \\ \hline 实现 & O(n) & O(1) \\ deque实现 & O(1) & O(1) \\ 链表实现 & O(1) & O(1) \\ \hline \end{array} $$ ### 选择建议: 1. 单线程环境优先选择`collections.deque` 2. 多线程场景使用`queue.Queue` 3. 需要动态扩容时考虑链表实现 4. 小数据量快速实现可用表(但要注意性能瓶颈)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值