循环队列的实现

【版权声明:转载请保留出处:blog.csdn.net/algorithm_only。邮箱:liuy0711@foxmail.com

在队列中也可以使用连续的内存空间存放队列元素,附设两个指针分别指向对头和队尾,初始化两个指针为0,当有元素进队时对为指针加1,有元素出对时队尾指针加1。但这样的话会有问题,就是出队列留下的地址空间就不会被利用了,且当开始分配的空间使用完时还会不停的申请空间,浪费了很对空间。若固定的空间的话队尾指针到了末尾就无法在添加元素了,而此时出队列留下的地址处还有空间无法使用。一个较好的办法是将对列构想成一个环形队列,当队尾指针到队列最后是又重最开始处使用空间,且规定队列头指针在队尾指针的下一个位置作为队列满的标志。可见队列顺序存储不能动态分配空间,需要在开始分配一个较大的空间,若无法估计队列长度,最好使用链式存储。

  • 循环队列存储结构

#define	OK			1
#define NULL_QUEUE		0
#define ERROR			-1

typedef struct qnode{
	elemtype		*base;
	int			front;
	int			rear;
}sqqueue;

  • 初始化循环队列
int init_sqqueue(sqqueue *sq)
{
	sq->base = (elemtype *)malloc(MAXQSIZE * sizeof(elemtype));
	if (!sq->base)
		return ERROR;

	sq->front = 0;
	sq->rear = 0;

	return OK;
}
初始化时分配MAXQSIZE个元素的空间,队头和队尾下标初始化为0;
  • 元素进队列
int in_sqqueue(sqqueue *sq, elemtype e)
{
	if ((sq->rear + 1) % MAXQSIZE == sq->front)
		return ERROR;
	sq->base[sq->rear] = e;
	sq->rear = (sq->rear + 1) % MAXQSIZE;
	return OK;
}
  • 元素出队列
int out_sqqueue(sqqueue *sq, elemtype *e)
{
	if (sq->front == sq->rear)
		return NULL_QUEUE;

	*e = sq->base[sq->front];
	sq->front = (sq->front + 1) % MAXQSIZE;

	return OK;
}
  • 取得队列长度
int get_queue_len(sqqueue sq)
{
	return (sq.rear-sq.front + MAXQSIZE) % MAXQSIZE;
}
  • 实现源码


### 循环队列的数据结构 循环队列是一种特殊的线性数据结构,其操作遵循先进先出 (FIFO) 原则。它通常基于数组实现,利用环形设计优化存储空间利用率并提高效率[^1]。 #### 数据结构特点 - **固定大小的数组**:循环队列依赖于一个固定长度的数组作为底层存储容器。 - **头指针 (`front`)** 和 **尾指针 (`rear`)**:分别用于指示当前队首位置和即将插入新元素的位置。 - **模运算处理边界条件**:当 `rear` 或 `front` 达到数组末尾时,通过取模运算将其重置为起始索引,从而形成逻辑上的“环”。 --- ### 实现方法 以下是基于数组实现循环队列的核心要点: #### 判断队列为空或满的状态 - 队列为 **空** 的条件是: \[ front = rear \] - 队列为 **满** 的条件可以通过预留一个额外的空间表示状态,即满足以下关系时认为队列已满: \[ (rear + 1) \% size = front \] 这种策略可以有效区分队列空与满的情况[^3]。 #### 核心函数实现 下面是一个简单的 Python 版本的循环队列实现示例: ```python class CircularQueue: def __init__(self, capacity): self.queue = [None] * capacity # 初始化固定大小的数组 self.capacity = capacity # 容量 self.front = 0 # 头部指针 self.rear = 0 # 尾部指针 def is_empty(self): # 判断队列是否为空 return self.front == self.rear def is_full(self): # 判断队列是否已满 return (self.rear + 1) % self.capacity == self.front def enqueue(self, item): # 入队操作 if self.is_full(): raise Exception("Queue is full") # 如果队列满了,则抛出异常 self.queue[self.rear] = item # 插入元素 self.rear = (self.rear + 1) % self.capacity # 更新尾指针 def dequeue(self): # 出队操作 if self.is_empty(): # 如果队列为空,则抛出异常 raise Exception("Queue is empty") item = self.queue[self.front] # 获取队首元素 self.front = (self.front + 1) % self.capacity # 更新头指针 return item # 返回被移除的元素 ``` 上述代码展示了如何定义一个基本的循环队列类及其核心功能[^2]。 --- ### 总结 循环队列通过巧妙地运用数组和模运算解决了传统线性队列中的存储浪费问题,同时提供了高效的入队和出队操作。在实际开发中,可以根据具体需求调整其实现细节,例如动态扩展容量或者支持多线程环境下的并发访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值