循环队列--顺序存储

#include<stdio.h>
 
#define OK      1
#define ERROR   0
#define TRUE    1
#define FALSE   0
 
#define MAXSIZE 20 //最多容纳19个元素,front之前的一个空间空出来
 
typedef int Status;
typedef int QElemType;
 
typedef struct {
    QElemType data[MAXSIZE];
    int front;//指向下一次要出队的元素
    int rear;//指向的位置是下一个入队元素的位置
}SqQueue;
 
Status visit(QElemType c){
    printf("%d ",c);
    return OK;
}
 
Status InitQueue(SqQueue *Q){
    Q->front = 0;
    Q->rear =0;
    return OK;
}
 
Status ClearQueue(SqQueue *Q){
    Q->front = Q->rear = 0;
    return 0;
}
 
Status QueueEmpty(SqQueue Q){
    if(Q.front == Q.rear){
        return TRUE;
    } else {
        return FALSE;
    }
}
 
int QueueLength(SqQueue Q){
    return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
 
Status GetHead(SqQueue Q,QElemType *e){
    if(Q.front == Q.rear){
        return ERROR;//空队列
    }
    *e = Q.data[Q.front];
    return OK;
}
 
Status EnQueue(SqQueue *Q,QElemType e){
    if(((Q->rear + 1) % MAXSIZE) == Q->front){
        return ERROR;//队列满
    }
    Q->data[Q->rear] = e;
    Q->rear = (Q->rear + 1) % MAXSIZE;
    return OK;
}
 
Status DeQueue(SqQueue *Q,QElemType *e){
    if(Q->rear == Q->front){
        return ERROR;
    }
    *e = Q->data[Q->front];
    Q->front = (Q->front + 1) % MAXSIZE;
    return OK;
}
 
Status QueueTraverse(SqQueue Q){
    int i;
    i = Q.front;
    while(i != Q.rear){
        visit(Q.data[i]);
        i = (i + 1) % MAXSIZE;
    }
    printf("\n");
    return OK;
}
 
int main(){
    Status j;
    int i = 0,l;
    QElemType e;
    SqQueue Q;
    InitQueue(&Q);
    printf("初始化队列后,队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
     
    for( i = 1; i <= 21 ; i++){
        EnQueue(&Q,i);
    }
    printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
     
    QueueTraverse(Q);
         
    DeQueue(&Q,&e);
    printf("出队的元素是 %d\n",e);
    printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
    QueueTraverse(Q);
 
    DeQueue(&Q,&e);
    printf("出队的元素是 %d\n",e);
    printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
    QueueTraverse(Q);
 
    DeQueue(&Q,&e);
    printf("出队的元素是 %d\n",e);
     
    EnQueue(&Q,1000);
    printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
    QueueTraverse(Q);
 
    EnQueue(&Q,2000);
    printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
    QueueTraverse(Q);
 
    EnQueue(&Q,3000);
    printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
    QueueTraverse(Q);
 
    EnQueue(&Q,4000);
    printf("队列是否为空:%d\t队列长度:%d\n",QueueEmpty(Q),QueueLength(Q));
    QueueTraverse(Q);
 
    GetHead(Q,&e);
    printf("队首元素 %d\n",e);
     
    ClearQueue(&Q);
    printf("清空队列后,队列是否为空 %d\t 队列长度 %d\n",QueueEmpty(Q),QueueLength(Q));
    printf("再次遍历队列");
    QueueTraverse(Q);
}

  

posted @ 2018-04-15 20:00  寻觅beyond  阅读(265)  评论(0)    收藏  举报
返回顶部