#include#include #include #define MaxSize 5 typedef struct { int data[MaxSize];//此处tag本应为bool类型的变量 初始化tag为0 int front,rear; // tag==0表明循环队列初始化完成或上一次操作为出队操作 int tag; // tag==1表明循环队列上一次操作为入队操作 }SqQueue; int InitQueue(SqQueue*Q){ Q->front=Q->rear=Q->tag=0; printf("该循环队列初始化完成nn"); } int isEmpty(SqQueue Q){ if(Q.front==Q.rear&&Q.tag==0) return 1; else return 0; } int length(SqQueue Q){//此处由于队空和队满时皆有Q.rear==Q.front 所以需要加一项tag是否为1来判断是队满还是队空 if(Q.front!=Q.rear) return((Q.rear-Q.front+MaxSize)%MaxSize); else if(isEmpty(Q)) return 0; else return MaxSize; } int EnQueue(SqQueue *Q,int e){ if(Q->front==Q->rear&&Q->tag==1){ printf("该循环队列已满 本次入队操作非法nn"); return 0; } Q->data[Q->rear]=e; Q->rear=(Q->rear+1)%MaxSize; Q->tag=1; printf("本次入队元素:%dnn",e); return 1; } int DeQueue(SqQueue *Q,int *e){ if(isEmpty(*Q)){ printf("该循环队列为空 本次出队操作非法nn"); return 0; } *e=Q->data[Q->front]; Q->front=(Q->front+1)%MaxSize; Q->tag=0; printf("本次出队元素:%dnn",*e); return 0; } int GetHead(SqQueue Q){ if(isEmpty(Q)){ printf("该循环队列为空 本次查对头元素操作非法nn"); return 0; } printf("循环队列当前对头元素为:%dnn",Q.data[Q.front]); return Q.data[Q.front]; } int main(){ SqQueue Q; int discard; InitQueue(&Q); DeQueue(&Q,&discard); if(isEmpty(Q)) printf("当前该循环队列为空nn"); else printf("当前该循环队列的长度为%dnn",length(Q)); EnQueue(&Q,9); EnQueue(&Q,9); EnQueue(&Q,5); EnQueue(&Q,2); EnQueue(&Q,7); EnQueue(&Q,7); if(isEmpty(Q)) printf("当前该循环队列为空nn"); else printf("当前该循环队列的长度为%dnn",length(Q)); DeQueue(&Q,&discard); if(isEmpty(Q)) printf("当前该循环队列为空nn"); else printf("当前该循环队列的长度为%dnn",length(Q)); GetHead(Q); return 1; }



