循环队列操作

 代码

#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 100
#define OK 1
#define ERROR -1
typedef int Status;
typedef int ElemType;

typedef struct queue{
    ElemType *Queue_array;  //初始化的动态分布存储空间
    int front;
    int rear;
}SqQueue;
//循环队列初始化
Status Init_CirQueue(SqQueue *Q){

    Q->Queue_array = (ElemType *)malloc(MAX_QUEUE_SIZE *sizeof(ElemType));
    if(!Q->Queue_array)
        return ERROR;
    Q->front = Q->rear;
    return OK;
}
//入队
Status Insert_CirQueue(SqQueue *Q, ElemType e){

    if((Q->rear + 1) % MAX_QUEUE_SIZE == Q->front)
        return ERROR;
    Q->Queue_array[Q->rear] = e;
    Q->rear = (Q->rear + 1) % MAX_QUEUE_SIZE;
    return OK;
}
//出队, 返回出去的值
Status Delete_CirQueue(SqQueue *Q, ElemType *x){
    if(Q->rear == Q->front)
        return ERROR;     //队空
    *x = Q->Queue_array[Q->front];
    Q->front = (Q->front + 1)%MAX_QUEUE_SIZE;
    return OK;
}
//求长度
int Length_CirQueue(SqQueue Q){
    return (Q.rear - Q.front + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
}
//是否为空
Status QueueEmpty(SqQueue Q){
    if(Q.rear == Q.front)
        return -1;
    return 0;
}
//输出队列的值
Status QueueTraverse(SqQueue Q){
    if(Q.rear == Q.front)
        return ERROR;
    while(Q.front != Q.rear){
        printf("%d\t", Q.Queue_array[Q.front]);
        Q.front++;
        if(Q.front == MAX_QUEUE_SIZE - 1)
            Q.front = 0;
    }
    printf("\n");
    return OK;

}
//清空队列
Status ClearCirQueue(SqQueue *Q){
    Q->rear = Q->front = 0;
    return OK;
}
//得到头元素
Status GetHead(SqQueue Q){
    if(Q.rear == Q.front)
        return ERROR;

    return (Q.Queue_array[Q.rear - 1]);
}
//销毁队列
void DstoryQueue(SqQueue *Q){
    free(Q->Queue_array);
}
//队列是否为满
Status QueueFull(SqQueue Q){
    if((Q.rear + 1) % MAX_QUEUE_SIZE ==  Q.front)
        return 0;
    return -1;

}


int main()
{

   SqQueue Q;
   Init_CirQueue(&Q);
   int e, n, i, x;
   int m = 0;
   printf("添加几个元素:");
   scanf("%d", &n);
   for(i = 0; i < n; i++){
        printf("输入第%d个数字:", i+1);
        scanf("%d", &e);
        Insert_CirQueue(&Q, e);
   }

   printf("1.输出队列;\n2.队列长度;\n3.出队并返回队尾元素;\n4.得到队头元素;\n5.判断队列是否为空;\n6.清空队列\n 7.是否为满\n");
   printf("输入-1时结束操作\n");
   while(m != -1){
        scanf("%d", &m);
        switch(m){
        case 1:
            printf("输出队列:\n");
            QueueTraverse(Q);
            break;
        case 2:
            printf("队列长度:\t%d\n", Length_CirQueue(Q));
            break;
        case 3:
            Delete_CirQueue(&Q, &x);
            printf("队列队尾元素为:%d\n", x);
            break;
        case 4:
            printf("得到队头元素:%d\n", GetHead(Q));
            break;
        case 5:
            printf("判断队列是否为空。-1为空,0为非空 \t%d\n",QueueEmpty(Q));
            break;
        case 6:
            printf("清空队列\n");
            ClearCirQueue(&Q);
            break;
        case 7:
            printf("0:队列满,-1:队列未满 \t%d\n", QueueFull(Q));

       }
   }


  

    return 0;
}

结果:

 

循环队列操作