循环队列
前面队列小述中我们讲到了队列的链式存储结构,下面我们介绍下队列的顺序存储结构。假设一个队列有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;
}