循环队列(c++)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef int elemtype;

typedef struct {
    int front;
    int rear;
    elemtype data[MaxSize];
}SqQueue;

int initQueue(SqQueue* Q) {
    Q->front = 0;
    Q->rear = 0;
    return 0;
}

int Size_Queue(SqQueue* Q) {
    return (Q->rear - Q->front + MaxSize) % MaxSize;
}

int EnQueue(SqQueue* Q, elemtype e) {
    if ((Q->rear + 1) % MaxSize == Q->front)
    {
        printf("队列已满!\n");
        return 0;
    }
    Q->data[Q->rear] = e;
    Q->rear = (Q->rear + 1) % MaxSize;
    return 0;
}

int DeQueue(SqQueue* Q, elemtype* e) {
    if (Q->front == Q->rear)
    {
        printf("队列为空!\n");
        return 0;
    }
    *e = Q->data[Q->front];
    Q->front = (Q->front + 1) % MaxSize;
    return 0;
}

void Show_Queue(SqQueue* Q) {
    int i = Q->front;
    if (Q->front == Q->rear)
    {
        printf("队列为空!\n");
        return;
    }
    printf("当前队列元素为:");
    while ((Q->front) % MaxSize != Q->rear)
    {
        if (Q->front == MaxSize)
        {
            Q->front %= MaxSize;
        }
        printf(" %d ", Q->data[Q->front]);
        Q->front++;
    }
    printf("\n");
    Q->front = i;
}

int main() {
    SqQueue Q;
    elemtype m;
    initQueue(&Q);
    Size_Queue(&Q);
    Show_Queue(&Q);
    printf("当前队列长度为:%d\n", Size_Queue(&Q));
    EnQueue(&Q, 5);
    EnQueue(&Q, 15);
    EnQueue(&Q, 25);
    EnQueue(&Q, 35);
    EnQueue(&Q, 45);
    Show_Queue(&Q);
    printf("当前队列长度为:%d\n", Size_Queue(&Q));
    DeQueue(&Q, &m);
    Show_Queue(&Q);
    printf("当前队列长度为:%d\n", Size_Queue(&Q));
    printf("被删除元素为:%d\n", m);
}

 重点:

通用的计算队列长度公式:(Q->rear - Q->front + MAXSIZE) % MAXSIZE

队列满的判断:(Q->rear + 1) % MAXSIZE == Q->front

队列为空的判断:Q->front == Q->rear

front指针向后移:Q->front = (Q->front + 1) % MAXSIZE

rear指针向后移:Q->rear = (Q->rear + 1) % MAXSIZE

posted @ 2022-05-31 14:37  fight挺  阅读(37)  评论(0)    收藏  举报