//结构定义
typedef int ElemType
typedef struct queue
{
ElemType *data;
int size;
int front;
int rear;
}Queue;
//初始化
void InitQueue(Queue *que)
{
if(que == NULL) exit(0);
que->data = (ElemType *)malloc(sizeof(ElemType));
if(que->data == NULL) exit(0);
que->size = INITSIZE;
que->front = que->rear = 0;
}
//判满
static int Full(Queue *que)
{
if((que->rear+1) % que->size == que->front)
{
return 1;
}
return 0;
}
//扩容
static int AppendSpace(Queue *que)
{
ElemType *s = (ElemType *)malloc(sizeof(ElemType*));
if(s == NULL) return 0;
int index = 0; //访问新空间的位置
int i= que->front; //访问原来空间从front到rear的内容
for( ; index < que->size-1 ; ++index)
{
s[index] = que->data[i];
i = (i+1) % que->size;
}
que->front = 0;
que->rear = que->size;
que->size* = 2;
free(que->data);
que->data = s;
return 1;
}
//判空
int Empty(Queue *que)
{
if(que == NULL) exit(0);
return que->front = que->rear ? 1 : 0;
}
//入队列
void PushQueue(Queue *que , ElemType val)
{
if(que == NULL) exit(0);
if(Full(que))
{
if(AppendSpace(que))
{
return;
}
}
que->data[que->rear] = val;
que->rear = (que->rear+1) % que->size; //类似于rear+1,因为要循环
}
//出队列
void PopQueue(Queue *que)
{
if(que == NULL) exit(0);
if(Empty(que)) return;
que->front = (que->front +1) % que->size;
}
//获取队列头元素
int GetHead(Queue *que , ElemType *reval)
{
if(que == NULL) exit(0);
if(Empty(que)) return 0;
*reval = que->data[que->front];
return 1;
}
//销毁
void DestroyQueue(Queue *que)
{
if(que == NULL) exit(0);
free(que->data);
que->data = NULL;
que->front = que->rear = que->size = 0;
}