数据结构与算法07——循环队列

2020-04-15  本文已影响0人  Foxhoundsun

循环队列的特点:
所有队列的特点都是先进先出
**在循环队列中,由于入队时:尾指针向前驱赶头指针。出队时:头指针向前驱赶尾指针。无论当队空或队满时:front==rear,所以不能判断队空或者队满。这个时候我们可以空出一个元素空间,也就是最后一个元素空间不使用,这样样的话,队满时就是:(rear+1)%n==front。从而判断队空和队满
**

image.png

循环队列的操作

#define OK 1
#define ERROR 0
#define ARR_SIZE 6
typedef int Status;

typedef struct Queue{
    int *QArr;//存放队列元素的数组
    int front;
    int rear;
}QUEUE;
Status InitQueue(QUEUE *q){
    q->QArr = (int *)malloc(sizeof(int) * ARR_SIZE);
    
    if (q->QArr != NULL) {
        q->front = q->rear = 0;
        return OK;
    }
    return ERROR;
}
Status IsEmptyQueue(QUEUE q){
    if (q.front == q.rear) {
        return OK;
    }
    return ERROR;
}
Status IsFullQueue(QUEUE q){
    if ((q.rear+1)%ARR_SIZE == q.front) {
        return OK;
    }
    return ERROR;
}
Status GetTopValue(QUEUE q){
    if (IsEmptyQueue(q)) return ERROR;
    
    return q.QArr[q.front];
}
int lengthOfQueue(QUEUE q){
    if (IsEmptyQueue(q)) return ERROR;
    
    return (q.rear - q.front + ARR_SIZE)%ARR_SIZE;
}
Status ClearQueue(QUEUE *q){
    
    q->front = q->rear = 0;
    
    return OK;
}

Status InQueue(QUEUE *q,int data){
    if (IsFullQueue(*q)) return ERROR;
    
    q->QArr[q->rear] = data;
    q->rear = (q->rear + 1)%ARR_SIZE;
    return OK;
}
Status OutQueue(QUEUE *q,int *data){
    if (IsEmptyQueue(*q)) return ERROR;
    
    //出队元素
    *data = q->QArr[q->front];
    q->QArr[q->front] = 0;
    q->front = (q->front + 1)%ARR_SIZE;
    
    return OK;
}

遍历

void printQueue(QUEUE q){
    if (IsEmptyQueue(q)) return;
    
    printf("打印队列!\n");
    while (q.front != q.rear) {
        printf("%d  ",q.QArr[q.front]);
        
        q.front = (q.front + 1)%ARR_SIZE;
    }
    printf("\n");
}

上一篇下一篇

猜你喜欢

热点阅读