欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

循环队列的C语言实现 --- 数据结构之队列的顺序存储

程序员文章站 2022-05-21 11:49:11
...

注意

这里队列的判满方法,采用的是少用一个元素空间的方法,即(rear + 1) % MaxSize == front时,队列满。

代码

#include<stdio.h>
#include<malloc.h>

#define MaxSize 100  // 队列的最大长度为 100-1=99

typedef struct {
    int data[MaxSize];
    int front; // 头指针指向队首元素 
	int rear; // 尾指针指向队尾元素的下一个元素 
} SeqQueue, *PSeqQueue;

// 初始化队列 
PSeqQueue Init_SeqQueue() {
    PSeqQueue Q;

    Q = (PSeqQueue)malloc(sizeof(SeqQueue));
    if (!Q) {
        return NULL;
    }
    // 将队头和队尾指针置为0 
    Q->front = 0;
    Q->rear = 0;
    return Q;
}

// 返回队列的实际长度 = (rear - front + maxSize) % maxSize 
int Length_SeqQueue(PSeqQueue Q) {
    return ((Q->rear - Q->front + MaxSize) % MaxSize);
}

// 判断队列是否为空,队首和队尾指针相等时为空 
int Empty_SeqQueue(PSeqQueue Q) {
    return Q->front == Q->rear;
}

// 入队操作,参数x为入队元素 
void In_SeqQueue(PSeqQueue Q, int x) {
	// 判断队列是否已满,这里通过少用一个元素空间来判断队列是否已满 
    if ((Q->rear + 1) % MaxSize == Q->front) {
        printf("Queue is full!\n");
        return;
    }
    Q->data[Q->rear] = x; // 对应元素入队 
    Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移  
}

// 出队操作,参数e用来存储出队的元素 
void Out_SeqQueue(PSeqQueue Q, int *e) {
    if (Empty_SeqQueue(Q)) { // 判断队列是否为空 
        printf("Queue NULL!\n");
        return;
    }
    *e = Q->data[Q->front]; // 出队元素的赋值 
    Q->front = (Q->front + 1) % MaxSize; // 队首元素后移 
}

// 获取队首元素,存放在参数e中 
int Front_SeqQueue(PSeqQueue Q, int *e) {
    if (Empty_SeqQueue(Q)) {
        printf("Queue NULL!\n");
        return 0;
    }
    *e = Q->data[Q->front];
    return 1;
}

// 遍历打印队列中的元素 
void Print_SeqQueue(PSeqQueue Q) {
    int i;

    if (Empty_SeqQueue(Q)) {
        printf("Queue NULL!\n");
    } else {
        i = Q->front;
        while (i != Q->rear) {
            printf("%d ", Q->data[i]);
            i = (i + 1) % MaxSize;
        }
        printf("\n");
    }
}

int main() {
    PSeqQueue Q;
    int e, n, i;

    printf("input the number of data :\n");
    scanf("%d", &n);

    Q = Init_SeqQueue();

    for (i = 0; i < n; i++) {
        scanf("%d", &e);
        In_SeqQueue(Q, e);
    }
    printf("The Queue is :\n");
    Print_SeqQueue(Q);

    printf("The length of Queue is %d.\n", Length_SeqQueue(Q));
    Out_SeqQueue(Q, &e);
    printf("The out data is %d.\n", e);

    Front_SeqQueue(Q, &e);
    printf("The front data is %d.\n", e);

    printf("Now , the queue is :\n");
    Print_SeqQueue(Q);

    printf("The length of the new Queue is %d.\n", Length_SeqQueue(Q));

    return 0;
}

循环队列的C语言实现 --- 数据结构之队列的顺序存储