数据结构-静态循环队列(C语言实现)

1. 导入头文件

编写代码过程中,涉及动态内存分配等常用的函数,需要引入如下头文件

#include<stdio.h>
#include<stdlib.h>

2. 结构体定义

len 表示初始化时的数组长度,队列的最大容量为len-1

typedef struct Queue
{
    int * pData;    // 数据存放数组
    int front;      // 队头索引
    int tail;       // 队尾索引
    int len;        // 队列长度
} QUEUE;

3. 函数声明

void init(QUEUE * pQueue, int length);    // 初始化
int isEmpty(QUEUE * pQueue); // 是否为空
int isFull(QUEUE * pQueue);      // 是否已满
void enQueue(QUEUE * pQueue, int val);      // 入队
void deQueue(QUEUE * pQueue, int *val);  // 出队
void show(QUEUE * pQueue);    // 列出所有元素

4. 队列初始化

初始时队列的头尾的索引都是 0

void init(QUEUE * pQ, int len)
{
    pQ->pData = (int *)malloc(sizeof(int ) * len);
    if (pQ->pData == NULL)
    {
        printf("内存分配失败");
        exit(-1);
    }
    pQ->front = 0;
    pQ->tail = 0;
    pQ->len = len;
}

5. 队列是否为空

int isEmpty(QUEUE * pQ)
{
    if (pQ->front == pQ->tail)
    {
        return 1;
    }
    return 0;
}

6. 队列是否满

循环队列需要取余操作

int isFull(QUEUE * pQ)
{
    if ((pQ->tail + 1)%(pQ->len)==pQ->front)
    {
        return 1;
    }
    return 0;
}

7. 入队操作

void enQueue(QUEUE * pQ, int val)
{
    if (isFull(pQ))
    {
        printf("队列已满");
        return;
    }

    pQ->pData[pQ->tail] = val;

    pQ->tail = (pQ->tail + 1) % (pQ->len);
}

8. 出队操作

void deQueue(QUEUE * pQ, int *val)
{
    if (isEmpty(pQ))
    {
        printf("队列为空");
        return;
    }

    *val = pQ->pData[pQ->front];
    pQ->front = (pQ->front + 1)%(pQ->len);
}

9.列出所有元素

front 的索引不一定比 tail 小,所以便利时 i 也要取余

void show(QUEUE * pQ)
{
    if (isEmpty(pQ))
    {
        printf("队列为空");
        return;
    }

    int i = pQ->front;

    while ((i % pQ->len)  != pQ->tail)
    {
        printf("%d,", pQ->pData[i]);
        i++;
    }
    printf("\n");
}

10. main函数

int main()
{
    int val;
    QUEUE q;
    init(&q, 5);
    enQueue(&q, 1);
    enQueue(&q, 2);
    enQueue(&q, 3);
    enQueue(&q, 4);
    //enQueue(&q, 5);
    show(&q);
    deQueue(&q, &val);
    deQueue(&q, &val);
    show(&q);
    enQueue(&q, 6);
    enQueue(&q, 7);
    show(&q);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/sugare/p/13166965.html