数据结构之队列(三)——循环队列

循环队列采用顺序存储的方式(数组),基本思想是通过一个数组存储数据,两个下标front和rear分别指向队头和队尾

由于假溢出现象:采用循环队列,又由于循环队列无法判断队列是空还是满,所以采用损失一个元素为空的代价来分别队列为空还是为满

与链队列不同的是:

循环队列的队头指针(下标)不是指向什么头结点,而是直接指向当前队头的元素

循环队列的队尾指针(下标)不是指向最后一个元素,而是指向最后一个元素的下一个下标

当循环队列为空的时候,队尾和队头下标均指向啊a[0]

循环队列的定义

一个数组存放数据,两个下标分别存放队头和队尾下标

typedef char DataType;
typedef struct Queue{
	DataType elem[MAXSIZE];
	int front;
	int rear;
}SeqQueue;

循环队列的初始化

队头下标和队尾下标均初始化为0

InitQueue(SeqQueue* Q)
{
	Q->front=0;
	Q->rear=0;	
}

  

入队操作

先判断是否已满:条件:(Q->rear+1)%MAXSIZE==Q->front

以上为牺牲一个空间的例子

bool EnterQueue(SeqQueue* Q,DataType x)
{
	if((Q->rear+1)%MAXSIZE==Q->front)
	{
		return false;
	}
	else
	{
		Q->elem[Q->rear]=x;
		Q->rear=(Q->rear+1)%MAXSIZE;
		return true;
	}
}

  

出对操作

先判断是否为空:条件:Q->front==Q->rear

bool DeleteQueue(SeqQueue* Q,DataType* x)
{
	if(Q->front==Q->rear)
	{
		return false;
	}
	else
	{
		*x=Q->elem[Q->front];
		Q->front=(Q->front+1)%MAXSIZE;
		return true;
	}
}

  

亲爱的听众朋友我是你的代班DJ
原文地址:https://www.cnblogs.com/YTYMblog/p/5379552.html