#include#include #include #define MaxSize 5 typedef struct{ //与第一种循环列表的实现唯一区别是rear指针指向当前队尾元素 而前者指向当前队尾元素的下一位置 int data[MaxSize];//所以此时在判空 判满 计算队列长度的语句上有所区别,如下所示 int front,rear; // 第一种rear 第二种rear //判空: Q.rear==Q.front (Q.rear+1)%MaxSize==Q.front }SqQueue; //判满: (Q.rear+1)%MaxSize==Q.front (Q.rear+2)%MaxSize==Q.front //长度: (Q.rear-Q.front+MaxSize)%MaxSize (Q.rear-Q.front+1-MaxSize)%MaxSize //Note: 此时如果在C语言中各自单独实现上述三种操作不需要使用SqQueue类型指针 所以使用"Q.成分"的写法 // 同时这种实现方式也需要牺牲一个存储单元 int IniteQueue(SqQueue *Q){ Q->front=0; Q->rear=MaxSize-1; printf("该循环队列已完成初始化nn"); return 1; } int isEmpty(SqQueue Q){ if((Q.rear+1)%MaxSize==Q.front) return 1; else return 0; } int length(SqQueue Q){ return((Q.rear-Q.front+MaxSize+1)%MaxSize); } int EnQueue(SqQueue *Q,int e){ if((Q->rear+2)%MaxSize==Q->front){ printf("该循环队列已满 本次入队操作非法nn"); return 0; } Q->rear=(Q->rear+1)%MaxSize; Q->data[Q->rear]=e; 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; 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; IniteQueue(&Q); if(isEmpty(Q)) printf("当前该循环队列为空nn"); else printf("当前该循环队列的长度为%dnn",length(Q)); EnQueue(&Q,9); EnQueue(&Q,5); EnQueue(&Q,2); EnQueue(&Q,7); EnQueue(&Q,9); 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; }



