#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#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("该循环队列初始化完成\n\n");
}
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("该循环队列已满 本次入队操作非法\n\n");
return 0;
}
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MaxSize;
Q->tag=1;
printf("本次入队元素:%d\n\n",e);
return 1;
}
int DeQueue(SqQueue *Q,int *e){
if(isEmpty(*Q)){
printf("该循环队列为空 本次出队操作非法\n\n");
return 0;
}
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;
Q->tag=0;
printf("本次出队元素:%d\n\n",*e);
return 0;
}
int GetHead(SqQueue Q){
if(isEmpty(Q)){
printf("该循环队列为空 本次查对头元素操作非法\n\n");
return 0;
}
printf("循环队列当前对头元素为:%d\n\n",Q.data[Q.front]);
return Q.data[Q.front];
}
int main(){
SqQueue Q;
int discard;
InitQueue(&Q);
DeQueue(&Q,&discard);
if(isEmpty(Q))
printf("当前该循环队列为空\n\n");
else
printf("当前该循环队列的长度为%d\n\n",length(Q));
EnQueue(&Q,9);
EnQueue(&Q,9);
EnQueue(&Q,5);
EnQueue(&Q,2);
EnQueue(&Q,7);
EnQueue(&Q,7);
if(isEmpty(Q))
printf("当前该循环队列为空\n\n");
else
printf("当前该循环队列的长度为%d\n\n",length(Q));
DeQueue(&Q,&discard);
if(isEmpty(Q))
printf("当前该循环队列为空\n\n");
else
printf("当前该循环队列的长度为%d\n\n",length(Q));
GetHead(Q);
return 1;
}
<数据结构> rear指针指向队尾元素下一位置&&设置一个标志变量tag的循环队列实现(C语言)(第3种/共6种)
最新推荐文章于 2022-07-25 17:34:47 发布