队列是一种基本的数据结构,它遵循先进先出(FIFO, First In First Out)的原则。这意味着最先添加到队列中的元素将是第一个被移除的。队列通常用于任务调度、广度优先搜索等场景。
队列的基本操作
- 入队(Enqueue) :将一个新元素添加到队列的末尾。
- 出队(Dequeue) :从队列的前端移除并返回一个元素。
- 查看队首元素(Front) :返回队列的第一个元素,但不移除它。
- 检查队列是否为空(IsEmpty) :检查队列中是否没有任何元素。
队列的实现方式
数组实现队列
使用数组来实现队列是最直观的方法。我们可以定义一个固定大小的数组,并维护两个指针,分别指向队列的前端和后端。
class Queue:
def __init__(self, capacity):
self.capacity = capacity
self.queue = [None] * self.capacity
self.front = 0
self.rear = -1
self.size = 0
def is_empty(self):
return self.size == 0
def is_full(self):
return self.size == self.capacity
def enqueue(self, item):
if self.is_full():
print("Queue Overflow")
return
self.rear = (self.rear + 1) % self.capacity
self.queue[self.rear] = item
self.size += 1
def dequeue(self):
if self.is_empty():
print("Queue Underflow")
return None
temp = self.queue[self.front]
self.front = (self.front + 1) % self.capacity
self.size -= 1
return temp
def front_element(self):
if self.is_empty():
print("Queue is empty")
return None
return self.queue[self.front]
# 示例使用
q = Queue(5)
q.enqueue(1)
q.enqueue(2)
print(q.front_element()) # 输出: 1
print(q.dequeue()) # 输出: 1
链表实现队列
链表可以更灵活地处理动态大小的队列,不需要预先定义容量。
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Queue:
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.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():
print("Queue Underflow")
return None
temp = self.front
self.front = temp.next
if self.front is None:
self.rear = None
return temp.data
def front_element(self):
if self.is_empty():
print("Queue is empty")
return None
return self.front.data
# 示例使用
q = Queue()
q.enqueue(1)
q.enqueue(2)
print(q.front_element()) # 输出: 1
print(q.dequeue()) # 输出: 1
应用场景
- 任务调度:操作系统中,CPU调度器使用队列来管理就绪进程。
- 广度优先搜索(BFS) :图的BFS算法使用队列来追踪需要访问的节点。
- 缓存系统:LRU缓存淘汰策略使用队列来追踪最近最少使用的项目。