队列的数组实现

简介: 队列的数组实现

像栈一样,队列也是表。使用队列时插入和删除分别在队列的两端进行

队列是一种先进先出(FIFO)的数据结构

队列的链表实现方式太过于简单,本文介绍数组的实现方式

实现思路:

1.维护两个索引,front代表队列的首部,rear代表队列的尾部

2.入队时,rear + 1,队列当前大小 + 1

3.出队时,front + 1, 队列当前大小 + 1

4.通过队列当前大小判断队列是否已满,来保证入队时新元素不会覆盖旧元素

5.将front和rear的递增后的索引对队列总大小取模,保证不会下标越界,同时实现循环数组

代码实现

1.队列结构体

typedef struct {
    int *data; // 数组
    int front; // 队列首部索引
    int rear; // 队列尾部索引
    int size; // 队列当前大小
    int capacity; // 队列总大小
} queue;

2.创建队列

void init_queue(queue *queue) {
    queue->data = (int *)malloc(INITIAL_CAPACITY * sizeof(int));
    queue->front = 0;
    queue->rear = -1;
    queue->size = 0;
    queue->capacity = INITIAL_CAPACITY;
}

3.入队

int enqueue(queue *queue, int value) {
    if (queue->size == queue->capacity) {
        expand(queue);
    }
    queue->rear = (queue->rear + 1) % queue->capacity; // 循环数组
    queue->data[queue->rear] = value;
    queue->size++;
}

4.出队

int enqueue(queue *queue, int value) {
    if (queue->size == queue->capacity) {
        expand(queue);
    }
    queue->rear = (queue->rear + 1) % queue->capacity; // 循环数组
    queue->data[queue->rear] = value;
    queue->size++;
}

5.销毁队列

void freeQueue(queue *queue) {
    free(queue->data);
    queue->data = NULL;
    queue->front = 0;
    queue->rear = -1;
    queue->size = 0;
    queue->capacity = 0;
}

6.测试

int main() {
    queue queue;
    initQueue(&queue);
    enqueue(&queue, 10);
    enqueue(&queue, 20);
    enqueue(&queue, 30);
    printf("Front element is %d\n", peek(&queue));
    printf("Dequeued element is %d\n", dequeue(&queue));
    printf("Front element is now %d\n", peek(&queue));
    freeQueue(&queue);
    return 0;
}

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

目录
相关文章
|
程序员 Shell C语言
【C/C++ main函数】深入探索C++中的main函数及其参数
【C/C++ main函数】深入探索C++中的main函数及其参数
1594 0
|
消息中间件 RocketMQ
CountDownLatch原理
文章讲述了CountDownLatch的工作原理及其用途: 1. CountDownLatch是一个简单的同步工具,用于等待一组操作完成。 2. 它通过AQS框架实现,利用共享锁模式控制线程的等待与唤醒。 3. 适用于多线程环境下,一个线程需要等待多个其他线程完成各自的任务后再继续执行的场景。
|
运维 Java Apache
Java中的日志框架:Log4j与SLF4J详解
Java中的日志框架:Log4j与SLF4J详解
|
安全 jenkins Devops
Jenkins 安全性和权限管理
【8月更文第31天】随着 DevOps 实践的普及,Jenkins 已经成为许多组织中不可或缺的一部分,用于自动化软件开发生命周期中的构建、测试和部署流程。然而,随着 Jenkins 的广泛应用,其安全性也变得越来越重要。Jenkins 提供了一系列的安全特性,包括访问控制列表(ACL)、认证和授权机制,以确保只有经过适当授权的用户才能访问和操作 Jenkins 系统。本文将详细介绍如何配置 Jenkins 的 ACL 以及其他安全措施,以保护 Jenkins 服务器免受未授权访问和攻击。
1021 0
|
运维 Serverless 网络安全
Serverless 应用引擎产品使用合集之能否用一个顶层函数,在云端动态的增加函数脚本或删除脚本
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
算法 定位技术 Python
秒懂算法 | A*算法实现最优路径规划
启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。
2904 1
秒懂算法  | A*算法实现最优路径规划
队列的定义、基本操作、顺序实现(初始化,入队,出队)
数据结构:队列的定义、基本操作、顺序实现(初始化,入队,出队)附有代码讲解
1271 0
|
数据采集 关系型数据库 MySQL
|
JavaScript 前端开发 编译器
TypeScript【什么是TypeScript、安装并编译TypeScript、变量声明、原始数据类型、数组、元组、任意值】(一)-全面详解(学习总结---从入门到深化)
TypeScript【什么是TypeScript、安装并编译TypeScript、变量声明、原始数据类型、数组、元组、任意值】(一)-全面详解(学习总结---从入门到深化)
209 0
|
数据安全/隐私保护 iOS开发
如何使用 altool 命令行工具上传 IPA 包:
如何使用 altool 命令行工具上传 IPA 包: