线性结构---循环队列

程序内有详细备注

结构特点:对头删除队尾插入,先进先出。

                  利用头尾的标识来决定、头删尾插,头尾标识的运用。

初始化队列

void initQueue(Queue *queue, size_t capacity)

返回队列内元素个数

size_t getSize(const Queue *queue)

添加新元素

void enqueue(Queue *queue, int element)

元素出队列

int dequeue(Queue *queue)

释放队列内存

void destroyQueue(Queue *queue)

遍历队列

void printQueue(Queue *queue)

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

// 队列结构
typedef struct
{
    int *data;       // 动态数组存储队列元素
    size_t size;     // 队列内元素个数
    size_t capacity; // 动态数组的容量
    size_t front;    // 队列头指针
    size_t rear;     // 队列尾指针
} Queue;

// 初始化队列
void initQueue(Queue *queue, size_t capacity)
{
    queue->data = (int *)malloc(capacity * sizeof(int)); // 分配初始容量的内存
    queue->size = 0;                                     // 初始元素个数为0
    queue->capacity = capacity;                          // 设置容量
    queue->front = 0;                                    // 队列头指针
    queue->rear = 0;                                     // 队列尾指针
}

// 返回队列内元素个数
size_t getSize(const Queue *queue)
{
    return queue->size;
}

// 添加新元素
void enqueue(Queue *queue, int element)
{
    if (queue->size == queue->capacity)
    {
        printf("队列已满,添加失败\n");
        return;
    }

    queue->data[queue->rear] = element;                // 将元素添加到队列尾部
    queue->rear = (queue->rear + 1) % queue->capacity; // 模n同1,循环更新队列尾指针
    queue->size++;                                     // 更新元素个数
}

// 元素出队列
int dequeue(Queue *queue)
{
    if (queue->size == 0)
    {
        return -1; // 队列为空,返回无效值
    }
    int dequeuedElement = queue->data[queue->front];     // 获取队列头部元素
    queue->front = (queue->front + 1) % queue->capacity; // 模n同1,头队列在运行到尾队列前时归0
    queue->size--;                                       // 更新元素格数
    return dequeuedElement;                              // 返回出队的元素
}

// 释放队列内存
void destroyQueue(Queue *queue)
{
    free(queue->data); // 释放动态数组内存
    queue->data = NULL;
    queue->capacity = 0;
    queue->size = 0;
    queue->rear = 0;
    queue->front = 0;
}

// 遍历队列
void printQueue(Queue *queue)
{
    for (int i = queue->front, j = 0; j < queue->size; i++, j++)
    {
        int data = queue->data[i % queue->capacity];//循环队列,从头开始j保证遍历个数
        printf("%d ", data);
    }
    printf("\n");
}

int main()
{
    Queue myQueue;

    // 初始化队列
    initQueue(&myQueue, 2);
    printf("初始化队列,初始容量为2\n");

    // 入队元素
    enqueue(&myQueue, 1);
    enqueue(&myQueue, 2);

    // 遍历
    printQueue(&myQueue);
    printf("队列内元素个数:%zu\n", getSize(&myQueue));

    // 出队元素
    printf("出队元素:%d\n", dequeue(&myQueue));
    
    // 遍历
    printQueue(&myQueue);
    printf("队列内元素个数:%zu\n", getSize(&myQueue));

    // 释放队列内存
    destroyQueue(&myQueue);
    printf("队列内存已释放\n");
    
    // 遍历
    printQueue(&myQueue);
    printf("队列内元素个数:%zu\n", getSize(&myQueue));

    return 0;
}
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值