数据结构之循环队列

本文介绍了循环队列的概念及操作,包括初始化、入队、出队的伪算法,并提供了C语言的实现示例。文章详细阐述了如何判断队列是否为空、是否已满,以及遍历队列的方法。通过实例展示了循环队列的使用,包括元素的添加和移除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文根据郝斌老师的指导记录数据结构之循环队列。


一、关于循环队列的一些问题

1、队列的2个参数不同场合有不同含义
	①队列的初始化
			front和rear的值是零
	②队列非空
			front代表的是队列的第一个元素
			rear代表是队列的最后一个有效元素的下一个元素
	③队列空
			front和rear的值相等,但不一定是零

2、循环队列入队伪算法讲解
	①将值存入r所代表的位置
	②rear = (rear + 1) % 数组的长度

3、循环队列出队伪算法讲解
	front = (front + 1 ) % 数组的长度

4、如何判断循环队列是否为空
	如果front与rear的值相等,则该队列一定为空

5、如何判断循环队列是否已满
	预备知识:
		front的值可能比rear大,
		front的值也可能比rear小,
		当然两者也可能相等。
   少用一个元素
   		如果rear和front的值紧挨着,则队列已满。
   		if(rear + 1) % 数组的长度 == front)
   			已满
   		else
   			不满 

二、代码

代码如下(示例):

#include <stdio.h>
#include <malloc.h>

typedef struct Queue {
	int* pBase;
	int front;
	int rear;

}QUEUE;

void Init_Queue(QUEUE* pQ);				//初始化循环队列
bool En_Queue(QUEUE* pQ, int val);		//入队
bool Full_Queue(QUEUE* pQ);				//判断循环队列是否为满
void Traverse_Queue(QUEUE* pQ);			//遍历循环队列
bool Out_Queue(QUEUE* pQ, int* val);	//出队
bool Empty_Queue(QUEUE* pQ);				//判断循环队列是否为空

int main(void) {
	int a;
	QUEUE Q;
	Init_Queue(&Q);
	En_Queue(&Q, 1);
	En_Queue(&Q, 2);
	En_Queue(&Q, 3);
	En_Queue(&Q, 4);
	En_Queue(&Q, 5);
	Traverse_Queue(&Q);


	Out_Queue(&Q, &a);
	Traverse_Queue(&Q);
	printf("出队的元素是:%d\n", a);
	return 0;
}

//循环队列初始化
void Init_Queue(QUEUE* pQ) {
	pQ->pBase = (int*)malloc( 6 * sizeof(int) );	//动态分配内存空间
	pQ->front = 0;
	pQ->rear = 0;



	return ;
}

//进队
bool En_Queue(QUEUE* pQ, int val) {
	if( Full_Queue(pQ) ) {
		return false;
	} else {
		pQ->pBase[pQ->rear] = val;
		pQ->rear = (pQ->rear + 1) % 6;
		return true;
	}
}

//出队
bool Out_Queue(QUEUE* pQ, int* val) {
	if( Empty_Queue(pQ) ){
		return false;
	} else {
		int* p;
		p = &pQ->pBase[pQ->front];
		*val = *p;
		pQ->front = (pQ->front + 1) % 6;
		//free(p);
		//p = NULL;
		return true;
	}
}



//先定义一个普通变量指向循环队列的头部front,如果没有指向rear就一直输出
void Traverse_Queue(QUEUE* pQ) {
	int p;
	p = pQ->front;
	while( p != pQ->rear ) {
		printf("%d ", pQ->pBase[p]);
		p = (p + 1) % 6;
	}
	printf("\n");

	return ;
}

//判断循环队列是否为满
bool Full_Queue(QUEUE* pQ) {
	if( (pQ->rear+1) % 6 == pQ->front) {
		return true;
	} else {
		return false;
	}
}

//判断循环队列是否为空
bool Empty_Queue(QUEUE* pQ) {
	if( pQ->front == pQ->rear ) {
		return true;
	}
	else {
		return false;
	}


}

显示结果:

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free(me)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值