//循环队列
/*
循环队列需要注意的几点:
1.如果Q->front == Q->rear,则可以判断队列为空
2.如果 (Q->rear+1)%Q->maxsize 则可以判断队满
3.无论是对循环队列进行插入或者删除操作,均可能涉及到尾指针或者头指针的调整
(并且不是简单对指针进行+1操作)
Q->rear = (Q->rear+1) % Q->queuesize;//入队
Q->front = (Q->front+1) % Q->queuesize;//出队
4.循环队列的长度(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
当Q->rear>Q->front时,循环队列的长度为Q->rear-Q->front
当Q->rearfront时,循环队列的长度为Q->front-Q->front+MAXQSIZE
综合上述两种情况,得出循环队列长度的计算方法

    队列(包括循环队列)是一个逻辑概念,而链表是个存储概念。一个队列是否是循环队列
        不取决于它将采用何种存储结构,根据需要,循环队列可以采用链式存储结构,
        也可以采用链式存储结构(包括循环链表) 

*/
#include
#include

#define MAXQSIZE 50//最大队列长度
#define ERROR 0
#define OK 1

typedef int ElemType;
typedef int Status;

typedef struct{
ElemType *base;
int front;//头指针,若队列不空指向队头元素
int rear;//尾指针,若队列不空指向队列尾元素的下一个位置
int queuesize;
}SqQueue;

/
函数声明
/
Status InitQueue(SqQueue Q,int maxsize);
Status EnQueue(SqQueue
Q,ElemType e);
Status DeQueue(SqQueue Q);
Status Traverse(SqQueue
Q);
/
主函数
/
int main(void){
SqQueue Q;
InitQueue(&Q,MAXQSIZE);
for(int i = 0; i<10; i++){
EnQueue(&Q,i+2);
}
for(int i = 0; i<=10; i++){
DeQueue(&Q);
}
}

/*
函数实现 
*/
//初始化队列
Status InitQueue(SqQueue *Q,int maxsize){
    Q->base = (ElemType*)malloc(MAXQSIZE*sizeof(ElemType));
    if(!Q){
        printf("初始化循环队列时分配空间失败!\n");
        return ERROR;
    }
    Q->queuesize = maxsize;
    Q->front = Q->rear = 0;
    printf("初始化循环队列成功!\n");
    return OK;
} 

//入队
//判断队满的条件:
//      在循环队列中少用一个空间,当当前队尾指针指向位置+1之后%队列长度为队头指针位置表示队满 
Status EnQueue(SqQueue *Q,ElemType e){
    if((Q->rear+1) % Q->queuesize == Q->front){ 
        printf("循环队列队满!\n");
        return ERROR; 
    }
    Q->base[Q->rear] = e;//将元素插入到队尾 
    printf("当前入队元素:%d\n",Q->base[Q->rear]);
    Q->rear = (Q->rear+1) % Q->queuesize;
//  Traverse(Q);
    return OK;
} 

//出队
Status DeQueue(SqQueue *Q){
    //队列不空,删除队头元素
    if(Q->front == Q->rear){
        printf("当前队列为空,出队失败!\n");
        return ERROR; 
    } 
    ElemType elem;
    elem = Q->base[Q->front];
    Q->front = (Q->front+1) % Q->queuesize;
    printf("当前出队元素:%d\n",elem);
    Traverse(Q);
    return OK;
} 

Status Traverse(SqQueue *Q){
    if(Q->front == Q->rear){
        printf("当前队列为空!\n");
        return ERROR; 
    }
    int p = Q->front;
    printf("队列中的元素:"); 
    while(p != Q->rear){
        printf("-[%d]",Q->base[p++]);
    }
    printf("\n");
    return OK;
}