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