循环队列

循环队列

循环队列不会产生假溢出。

当队列满时,还有一个空闲单元。

废话不多说,上代码。

循环队列的声明

#define MAX_SIZE 20
typedef int Type;
/*顺序存储结构*/
typedef struct sqQueue
{
	Type data[MAX_SIZE];
	int front;	//头指针
	int rear;	//尾指针,若队列不空,指向队列尾元素的下一个
}sqQueue;

//1 创建一个空队列
sqQueue* queue_creat();

//2 入队列
bool queue_push(sqQueue* queue,Type val);

//3 出队列
Type queue_pop(sqQueue* queue);

//4 计算队列的长度
int queue_length(sqQueue* queue);

循环队列的实现

//1 创建一个空队列
sqQueue* queue_creat()
{
	sqQueue* temp = (sqQueue*)malloc(sizeof(sqQueue));
	if (temp == nullptr)
	{
		printf("创建队列失败");
	}
	temp->front = 0;
	temp->rear = 0;
	return temp;
}

//2 入队列
bool queue_push(sqQueue* queue,Type val)
{
	if ((queue->rear + 1) % MAX_SIZE == queue->front)//队列判满条件
	{
		printf("队列已满,入队失败");
		return false;
	}
	queue->data[queue->rear] = val;//将元素赋值给队尾
	queue->rear = (queue->rear + 1) % MAX_SIZE;//rear指针往后移动一位,若已经指向队尾但队列没有满,则转到头部
	return true;
}

//3 出队列
Type queue_pop(sqQueue* queue)
{
	if (queue->front == queue->rear)//队空判断条件
	{
		printf("队列为空,出队失败");
		return false;
	}
	Type val = queue->data[queue->front];//记录出队元素
	queue->front = (queue->front + 1) % MAX_SIZE;//front指针往后移动一位,若已经指向队尾,则转到头部
	return val;
}

//4 计算队列的长度
int queue_length(sqQueue* queue)
{
	return (queue->rear - queue->front + MAX_SIZE) % MAX_SIZE;
}

posted @ 2022-05-12 22:01  宣哲  阅读(203)  评论(0编辑  收藏  举报