
在计算机科学的世界里,队列是一种极为重要的数据结构,它遵循先进先出(FIFO,First-In-First-Out)的原则,就像现实生活中排队等待服务一样,先到的人先接受服务。队列在很多场景中都有广泛应用,如操作系统中的任务调度、网络通信中的数据包处理等。本文将深入探讨队列的两种常见实现方式:顺序队列和链式队列。
顺序队列是基于数组实现的队列。它使用一个固定大小的数组来存储队列中的元素,并通过两个指针(通常称为队头指针和队尾指针)来管理队列的入队和出队操作。队头指针指向队列的第一个元素,队尾指针指向队列的最后一个元素的下一个位置。
class SeqQueue:def __init__(self, max_size):# 初始化队列,创建一个大小为 max_size 的数组self.max_size = max_sizeself.queue = [None] * max_sizeself.front = 0self.rear = 0def is_empty(self):# 判断队列是否为空return self.front == self.reardef is_full(self):# 判断队列是否已满return (self.rear + 1) % self.max_size == self.frontdef enqueue(self, item):# 入队操作if self.is_full():print("Queue is full, cannot enqueue.")returnself.queue[self.rear] = itemself.rear = (self.rear + 1) % self.max_sizedef dequeue(self):# 出队操作if self.is_empty():print("Queue is empty, cannot dequeue.")return Noneitem = self.queue[self.front]self.front = (self.front + 1) % self.max_sizereturn itemdef peek(self):# 获取队头元素if self.is_empty():print("Queue is empty.")return Nonereturn self.queue[self.front]
# 创建一个最大容量为 5 的顺序队列queue = SeqQueue(5)# 入队操作queue.enqueue(1)queue.enqueue(2)queue.enqueue(3)# 出队操作print(queue.dequeue()) # 输出: 1# 获取队头元素print(queue.peek()) # 输出: 2
链式队列是基于链表实现的队列。它使用链表节点来存储队列中的元素,每个节点包含一个数据域和一个指向下一个节点的指针。通过维护两个指针(队头指针和队尾指针)来管理队列的入队和出队操作。队头指针指向链表的第一个节点,队尾指针指向链表的最后一个节点。
class Node:def __init__(self, data):# 初始化链表节点self.data = dataself.next = Noneclass LinkedQueue:def __init__(self):# 初始化链式队列self.front = Noneself.rear = Nonedef is_empty(self):# 判断队列是否为空return self.front is Nonedef enqueue(self, item):# 入队操作new_node = Node(item)if self.is_empty():self.front = new_nodeself.rear = new_nodeelse:self.rear.next = new_nodeself.rear = new_nodedef dequeue(self):# 出队操作if self.is_empty():print("Queue is empty, cannot dequeue.")return Noneitem = self.front.dataself.front = self.front.nextif self.front is None:self.rear = Nonereturn itemdef peek(self):# 获取队头元素if self.is_empty():print("Queue is empty.")return Nonereturn self.front.data
# 创建一个链式队列queue = LinkedQueue()# 入队操作queue.enqueue(1)queue.enqueue(2)queue.enqueue(3)# 出队操作print(queue.dequeue()) # 输出: 1# 获取队头元素print(queue.peek()) # 输出: 2
| 比较项 | 顺序队列 | 链式队列 |
|---|---|---|
| 实现方式 | 基于数组 | 基于链表 |
| 空间复杂度 | 固定大小,可能有空间浪费 | 动态分配,无空间浪费 |
| 时间复杂度 | 入队和出队操作时间复杂度为 O(1) | 入队和出队操作时间复杂度为 O(1) |
| 适用场景 | 队列大小已知且固定 | 队列大小动态变化 |
顺序队列和链式队列是队列的两种常见实现方式,它们各有优缺点。在实际应用中,我们可以根据具体的需求来选择合适的实现方式。如果队列的大小已知且固定,顺序队列是一个不错的选择;如果队列的大小动态变化,链式队列则更为合适。通过掌握这两种实现方式,我们可以更好地利用队列这种数据结构来解决实际问题。