循环队列的插入与删除

队列:一种可以实现“先进先出”的存储结构

目录

一、循环队列是什么?

二、循环队列的插入与删除

1.循环队列的结构

2.循环队列的初始化

3.循环队列的插入(入队)

4.循环队列的删除(出队)

5.打印循环队列

6.主函数

7.完整代码

8.编码结果

总结


一、循环队列是什么?

        循环队列就好比我们乘坐公交车,当我们上车发现车后面坐满了而前面还有空座的时候,肯定不是说下车等下一俩,而是后面没座了那我就坐前面呗,循环队列解决的就是这样一个问题。因此我们将队列头尾相接的顺序存储结构称为循环队列

二、循环队列的插入与删除

1.循环队列的结构

typedef int QElemType;	//QElemType根据实际情况输入的元素而定,这里假设为int

//定义一个队列(顺序存储)
typedef struct Queue	
{
	QElemType data[MAXSZIE];    //静态存储
	int front;	//指向队头元素
	int rear;	//指向队尾元素
}Queue;

2.循环队列的初始化

//初始化一个循环队列
Queue* InitQueue()
{
	Queue *Q=(Queue*)malloc(sizeof(Queue));	//为循环队列开辟一个动态存储空间
	Q->front=0;
	Q->rear=0;		//设置为空队列
	return Q;
}

3.循环队列的插入(入队)

//循环队列的插入
void enQueue(Queue* Q,QElemType data)
{
	if((Q->rear+1)%MAXSZIE==Q->front)	//对队列是否满进行操作
	{
		printf("队列已满,无法进行插入操作\n");
	}
	Q->data[Q->rear]=data;	
	Q->rear=(Q->rear+1)%MAXSZIE;
}

4.循环队列的删除(出队)

//循环队列的出队
QElemType deQueue(Queue *Q)
{
	if(Q->front==Q->rear)	//判断队列是否为空
	{
		printf("队列为空,无法进行删除操作\n");

	}
	int e=Q->data[Q->front];		//将删除的元素保留到data中
	Q->front=(Q->front+1)%MAXSZIE;	//将指向第一个元素的指针向后一位
	return e;	

}

5.打印循环队列

//打印队列
void printQueue(Queue *Q)
{
	int index=Q->front;
	for(int i=0;i<QueueLength(Q);i++)
	{
		printf("%d->",Q->data[index]);
		index=(index+1)%MAXSZIE;
	}
	printf("NULL");
}

6.主函数

int main()
{
	Queue *Q=InitQueue();
	enQueue(Q,17);
	enQueue(Q,5);
	enQueue(Q,2);
	enQueue(Q,0);
	enQueue(Q,33);
	printQueue(Q);
	int num=deQueue(Q);
	printf("\n删除的元素为:%d\n",num);
	printQueue(Q);
	return 0;
}

7.完整代码

#include<stdio.h>
#include<stdlib.h>

#define MAXSZIE 10	//定义最大数组长度为10

typedef int QElemType;	//QElemType根据实际情况输入的元素而定,这里假设为int

//定义一个队列(顺序存储)
typedef struct Queue	
{
	QElemType data[MAXSZIE];
	int front;	//指向队头元素
	int rear;	//指向队尾元素
}Queue;

//初始化一个循环队列
Queue* InitQueue()
{
	Queue *Q=(Queue*)malloc(sizeof(Queue));	//为循环队列开辟一个动态存储空间
	Q->front=0;
	Q->rear=0;		//设置为空队列
	return Q;
}

//当前队列的长度
int QueueLength(Queue *Q)
{
	return (Q->rear-Q->front+MAXSZIE)%MAXSZIE;	//计算队列长度的公式
}

//循环队列的插入
void enQueue(Queue* Q,QElemType data)
{
	if((Q->rear+1)%MAXSZIE==Q->front)	//对队列是否满进行操作
	{
		printf("队列已满,无法进行插入操作\n");
	}
	Q->data[Q->rear]=data;	
	Q->rear=(Q->rear+1)%MAXSZIE;
}
 
//循环队列的出队
QElemType deQueue(Queue *Q)
{
	if(Q->front==Q->rear)	//判断队列是否为空
	{
		printf("队列为空,无法进行删除操作\n");

	}
	int e=Q->data[Q->front];		//将删除的元素保留到data中
	Q->front=(Q->front+1)%MAXSZIE;	//将指向第一个元素的指针向后一位
	return e;	

}

//打印队列
void printQueue(Queue *Q)
{
	int index=Q->front;
	for(int i=0;i<QueueLength(Q);i++)
	{
		printf("%d->",Q->data[index]);
		index=(index+1)%MAXSZIE;
	}
	printf("NULL");
}

int main()
{
	Queue *Q=InitQueue();
	enQueue(Q,17);
	enQueue(Q,5);
	enQueue(Q,2);
	enQueue(Q,0);
	enQueue(Q,33);
	printQueue(Q);
	int num=deQueue(Q);
	printf("\n删除的元素为:%d\n",num);
	printQueue(Q);
	return 0;
}

8.编码结果


总结

队尾指针是rear,队头是front,其中QueueSize为循环队列的最大长度
1.队空条件:rear==front
2.队满条件:(rear+1) %QueueSIze==front
3.计算队列长度:(rear-front+QueueSize)%QueueSize
4.入队:(rear+1)%QueueSize
5.出队:(front+1)%QueueSize

猜你喜欢

转载自blog.csdn.net/Lookdrama/article/details/127498778