环形队列的存储结构和基本定义的实现:
为了能够充分地使用数组中的存储空间,把数组的前端和后端连接起来,形成一个环形的顺序表,即把存储队列元素的表从逻辑上看成一个环,称为环形队列或循环队列。
用rear==MaxSize-1作为队满的条件有缺陷。可能队列为空,但仍满足该条件。这时进队时出现“上溢出”,这种溢出并不是真正的溢出,在data数组中存在可以存放元素的空位置,所以这是一种假溢出。
在顺序队列中,由于产生了队满上溢出和队空下溢出,使得这两种假溢出影响了队列存储元素的过程,因此,采用环形队列将其进行改进。
环形队列的四要素:
- 队空条件:front=rear
- 队满条件:(rear+1)%MaxSize=front
- 进队e操作:rear=(rear+1)%MaxSize; 将e放在rear处
- 出队操作:front=(front+1)%MaxSize;取出front处元素e;
环形队列的进队出队示意图:
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int front,rear; //队首和队尾指针
} ClQueue;
void InitQueue(ClQueue *&q)
{ q=(ClQueue *)malloc (sizeof(ClQueue));
q->front=q->rear=0;
}
void DestroyQueue(ClQueue *&q)
{
free(q);
}
bool QueueEmpty(ClQueue *q)
{
return(q->front==q->rear);
}
bool enQueue(ClQueue *&q,ElemType e)
{ if ((q->rear+1)%MaxSize==q->front) //队满上溢出
return false;
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
return true;
}
bool deQueue(ClQueue *&q,ElemType &e)
{ if (q->front==q->rear) //队空下溢出
return false;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
return true;
}