python 实现循环队列算法
循环队列算法是一种基于数组实现的队列数据结构,它的特点是队列的尾部指针可以循环到数组的头部,形成一个环形结构。这种结构可以有效地解决数组队列在元素出队时可能出现的“假溢出”问题,从而更高效地利用数组空间。循环队列使用一个固定大小的数组来存储队列元素,数组的大小是预先指定的。循环队列有两个指针,分别是指向队列头部元素的头指针(front)和指向队列尾部元素下一个位置的尾指针(rear)。当队列为空时
循环队列算法介绍
循环队列算法是一种基于数组实现的队列数据结构,它的特点是队列的尾部指针可以循环到数组的头部,形成一个环形结构。这种结构可以有效地解决数组队列在元素出队时可能出现的“假溢出”问题,从而更高效地利用数组空间。
定义与特点
循环队列使用一个固定大小的数组来存储队列元素,数组的大小是预先指定的。
循环队列有两个指针,分别是指向队列头部元素的头指针(front)和指向队列尾部元素下一个位置的尾指针(rear)。
当队列为空时,头指针和尾指针指向同一个位置。
当队列满时,尾指针的下一个位置将等于头指针的位置。但需要注意的是,由于存在“假溢出”问题,仅通过头尾指针相等来判断队列满是不准确的,通常还需要其他方式(如使用计数器或特殊的判断逻辑)来确定队列是否已满。
基本操作
循环队列的主要操作包括:
初始化:设置头指针和尾指针都指向数组的起始位置,并初始化队列长度为0。
入队(Enqueue):
判断队列是否已满,如果已满则无法继续入队。
将新元素添加到尾指针所指向的位置。
将尾指针向后移动一位,如果尾指针已经到达数组的末尾,则将其循环移动到数组的开头。
更新队列长度(如果使用了计数器)。
出队(Dequeue):
判断队列是否为空,如果为空则无法继续出队。
取出头指针所指向的元素作为出队元素。
将头指针向后移动一位,如果头指针已经到达数组的末尾,则将其循环移动到数组的开头。
更新队列长度(如果使用了计数器)。
判空:检查队列是否为空,通常通过比较队列长度是否为0或头指针和尾指针是否相等(但需要注意区分队列空和队列满的情况)来实现。
判满:检查队列是否已满,由于存在“假溢出”问题,不能仅通过头尾指针相等来判断。常用的方法有:
使用一个额外的计数器来记录队列中的元素个数,当计数器等于数组大小时表示队列满。
使用一种特殊的判断逻辑,如(rear + 1) % MAXSIZE == front,其中MAXSIZE是数组的大小。
示例代码
以下是一个简单的循环队列实现的示例代码片段:
// 假设已经定义了循环队列的结构体CirclesQueue和相关的宏定义MAXSIZE
// 初始化循环队列
int init(CirclesQueue *Q) {
Q->front = Q->rear = 0;
return 0;
}
// 入队操作
int enqueue(CirclesQueue *Q, DataType x) {
if (isfull(Q)) { // 假设isfull函数已经定义,用于判断队列是否已满
printf("队列已满!100001\n");
return 100001;
}
Q->rear = (Q->rear + 1) % MAXSIZE; // 尾指针向后移动一位,并循环
Q->data[Q->rear] = x; // 在新位置添加元素
return 0;
}
// 出队操作
int dequeue(CirclesQueue *Q, DataType *x) {
if (isempty(Q)) { // 假设isempty函数已经定义,用于判断队列是否为空
printf("队列为空!100002\n");
return 100002;
}
Q->front = (Q->front + 1) % MAXSIZE; // 头指针向后移动一位,并循环
*x = Q->data[Q->front]; // 取出头指针所指向的元素
return 0;
}
请注意,上述代码仅为示例,并未包含所有必要的函数定义(如isfull和isempty)和宏定义(如MAXSIZE和DataType)。在实际应用中,您需要根据具体需求来完善这些定义。
循环队列算法python实现样例
以下是Python实现循环队列算法的示例代码:
class CircularQueue:
def __init__(self, k):
self.size = k
self.queue = [None] * k
self.head = self.tail = -1
def enqueue(self, value):
if self.is_full():
return False
if self.is_empty():
self.head = self.tail = 0
else:
self.tail = (self.tail + 1) % self.size
self.queue[self.tail] = value
return True
def dequeue(self):
if self.is_empty():
return False
if self.head == self.tail:
self.head = self.tail = -1
else:
self.head = (self.head + 1) % self.size
return True
def front(self):
if self.is_empty():
return -1
return self.queue[self.head]
def rear(self):
if self.is_empty():
return -1
return self.queue[self.tail]
def is_empty(self):
return self.head == -1
def is_full(self):
return (self.tail + 1) % self.size == self.head
使用示例:
queue = CircularQueue(3)
print(queue.enqueue(1)) # 输出: True
print(queue.enqueue(2)) # 输出: True
print(queue.enqueue(3)) # 输出: True
print(queue.enqueue(4)) # 输出: False
print(queue.front()) # 输出: 1
print(queue.rear()) # 输出: 3
print(queue.dequeue()) # 输出: True
print(queue.front()) # 输出: 2
print(queue.rear()) # 输出: 3
print(queue.enqueue(4)) # 输出: True
print(queue.rear()) # 输出: 4
在上述代码中,CircularQueue
类实现了循环队列的基本操作,包括初始化队列、入队、出队、查看队首元素、查看队尾元素、判断队列是否为空以及判断队列是否已满。在入队操作时,利用取余运算实现了循环队列的环形特性。
更多推荐
所有评论(0)