链式队列和循环队列是两种常见的队列实现方式,它们各自具有不同的特点和适用场景。下面我们将分别介绍这两种队列的模拟、实现以及应用。
一、链式队列
链式队列是用链表实现的队列,队列的插入和删除操作分别在表头和表尾进行。链式队列通常包含一个头指针front和一个尾指针rear,分别指向队列的头结点和尾结点。
模拟:
初始化:创建一个空链表作为队列,设置头指针front和尾指针rear都为NULL。
入队操作:在链表尾部插入一个新结点,并将尾指针rear指向该结点。
出队操作:删除链表头部结点,并将头指针front指向下一个结点。
实现:
代码实现
以下是链式队列的Python实现示例:
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
class LinkedQueue:
def __init__(self):
self.front = None
self.rear = None
def enqueue(self, data):
new_node = Node(data)
if self.rear is None:
self.front = self.rear = new_node
else:
self.rear.next = new_node
self.rear = new_node
def dequeue(self):
if self.front is None:
return None
else:
data = self.front.data
self.front = self.front.next
if self.front is None:
self.rear = None
return data
应用:
链式队列适用于需要动态调整队列大小的情况,例如在网络编程中处理数据包、在操作系统中管理进程等。
二、循环队列
循环队列是用数组实现的队列,通过取模运算实现循环。循环队列通常设置一个front指针指向队头元素,一个rear指针指向队尾元素的下一个位置。当队列为空时,front和rear相等;当队列满时,(rear+1)%队列长度=front。
模拟:
初始化:创建一个固定大小的数组作为队列,设置front和rear都为0。
入队操作:在rear位置插入一个新元素,并将rear指针向后移动一位(如果rear到达数组末尾,则回到数组开头)。
出队操作:删除front位置的元素,并将front指针向后移动一位(如果front到达数组末尾,则回到数组开头)。
实现:
以下是循环队列的Python实现示例:
class CircularQueue:
def __init__(self, k):
self.k = k
self.queue = [0] * k
self.head = self.tail = -1
# 插入元素到队尾
def enqueue(self, data):
if ((self.tail + 1) % self.k == self.head):
print("循环队列已满\n")
elif (self.head == -1): # 插入第一个元素
self.head = 0
self.tail = 0
self.queue[self.tail] = data
else: # 队列非空
self.tail = (self.tail + 1) % self.k # 循环队列
self.queue[self.tail] = data
# 删除队头元素
def dequeue(self):
if (self.head == -1): # 空队列
print("循环队列为空\n")
elif (self.head == self.tail): # 队列中只剩下一个元素
temp = self.queue[self.head]
self.head = -1
self.tail = -1
return temp
else:
temp = self.queue[self.head]
self.head = (self.head + 1) % self.k
return temp
应用:
循环队列适用于需要固定大小队列的场景,例如在缓存管理、滑动窗口算法等中都有广泛应用。通过循环队列,我们可以有效地避免数组越界问题,并且能够快速判断队列是否为空或已满。