您的位置:首页 > 其它

循环队列

2015-08-29 11:16 211 查看
循环队列
前面队列小述中我们讲到了队列的链式存储结构,下面我们介绍下队列的顺序存储结构。假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的存储单元,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端则是队头。

队列的顺序存储结构中,入队列就是在队尾追加一个元素,不需要任何移动,时间复杂度为O(1)。出队列则不同,我们已经假设下标为0的位置是队列的队头,因此,每次出队列操作,所有元素都需要向前移动,此时的时间复杂度为O(n)。

针对上述缺点我们提出循环队列。循环队列容量是固定的,并且它的队头和队尾指针都可以随着元素出入队列而发生改变。如果队列后面满了,就从头开始,达到一种循环的状态。(循环队列中的元素也是数组存储)

循环队列的存储结构:
#define MAXSIZE 100
typedef struct
{
	ElemType *base;//用于存放内存分配基地址
	ElemType aa[MAXSIZE];//也可以用数组存放 这两种方式任意选择一种
	int front;
	int rear;//
}cycleQueue;


初始化一个循环队列的代码:
void initQueue(cycleQueue *q)
{
	q->base =(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
	if(!(q->base))
	{
		exit(0);
	}
	q->front = q->rear = 0;
}


循环队列中元素入列的代码:
int  InsertQueue(cycleQueue *q,ElemType e)
{
	if((q->rear + 1)/MAXSIZE==q->front)//假设队列中还有一个元素空的时候,此时队列的状态为满
	{
		return -1;
	}
	q->base[q->rear] = e;
	q->rear = (q->rear + 1)%MAXSIZE;

	return 0;
}
循环队列中元素出列的代码:
int  DeleteQueue(cycleQueue *q,ElemType *e)
{
	if(q->rear ==q->front)//队列为空
	{
		return -1;
	}
	*e = q->base[q->front];
	q->front = (q->front + 1)%MAXSIZE;

	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: