python中如何顺序表和单链表实现队列

在Python中,可以使用顺序表(基于列表)和单链表来实现队列。以下是两种实现方式的详细说明和代码示例:


一、顺序表(基于动态列表)实现队列

原理:使用Python列表模拟队列,入队时在列表尾部添加元素,出队时从列表头部移除元素。但频繁的头部操作会导致时间复杂度较高。

class ListQueue:
    def __init__(self):
        self.items = []  # 用列表存储元素
    
    def enqueue(self, item):
        """入队:添加到列表尾部(O(1)时间)"""
        self.items.append(item)
    
    def dequeue(self):
        """出队:移除列表头部元素(O(n)时间)"""
        if not self.is_empty():
            return self.items.pop(0)
        return None  # 队列为空时返回None
    
    def is_empty(self):
        """判断队列是否为空"""
        return len(self.items) == 0
    
    def size(self):
        """返回队列长度"""
        return len(self.items)

# 示例用法
q = ListQueue()
q.enqueue(1)
q.enqueue(2)
print(q.dequeue())  # 输出 1

缺点pop(0)的时间复杂度为O(n),数据量大时效率低。


二、单链表实现队列

原理:通过链表节点连接,维护头尾指针,实现高效入队和出队操作。

class Node:
    """链表节点类"""
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedListQueue:
    def __init__(self):
        self.head = None  # 头指针(出队端)
        self.tail = None  # 尾指针(入队端)
    
    def enqueue(self, data):
        """入队:在链表尾部添加节点(O(1)时间)"""
        new_node = Node(data)
        if self.tail is None:  # 队列为空时,头尾均指向新节点
            self.head = new_node
            self.tail = new_node
        else:
            self.tail.next = new_node  # 将新节点链接到尾部
            self.tail = new_node       # 更新尾指针
    
    def dequeue(self):
        """出队:移除链表头部节点(O(1)时间)"""
        if self.head is None:
            return None  # 队列为空时返回None
        data = self.head.data
        self.head = self.head.next     # 头指针后移
        if self.head is None:          # 如果队列已空,重置尾指针
            self.tail = None
        return data
    
    def is_empty(self):
        """判断队列是否为空"""
        return self.head is None
    
    def size(self):
        """返回队列长度(遍历链表)"""
        count = 0
        current = self.head
        while current:
            count += 1
            current = current.next
        return count

# 示例用法
q = LinkedListQueue()
q.enqueue(1)
q.enqueue(2)
print(q.dequeue())  # 输出 1

优点:入队和出队的时间复杂度均为O(1),效率更高。


三、两种实现的对比

实现方式时间复杂度空间复杂度适用场景
顺序表(列表)入队O(1),出队O(n)O(n)数据量较小的场景
单链表入队O(1),出队O(1)O(n)高频入队/出队操作

四、扩展:循环队列(顺序表优化)

若需顺序表的高效实现,可使用循环队列(固定容量)来避免频繁移动元素:

class CircularQueue:
    def __init__(self, capacity):
        self.capacity = capacity
        self.queue = [None] * capacity
        self.front = 0    # 队头指针
        self.rear = 0     # 队尾指针
        self.size = 0     # 当前元素数量
    
    def enqueue(self, item):
        if self.size == self.capacity:
            raise Exception("队列已满")
        self.queue[self.rear] = item
        self.rear = (self.rear + 1) % self.capacity
        self.size += 1
    
    def dequeue(self):
        if self.size == 0:
            raise Exception("队列为空")
        item = self.queue[self.front]
        self.front = (self.front + 1) % self.capacity
        self.size -= 1
        return item

特点:通过模运算实现环形存储,入队和出队均为O(1)时间,但需要预先分配固定容量。

根据具体需求选择合适的实现方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值