探秘数据结构中的队列:从理论到实际操作

个人主页-爱因斯晨

[文章专栏-

数据结构](https://blog.csdn.net/2401_87533975/category_12973760.html?spm=1001.2014.3001.5482)

最近发现一个巨牛的人工智能的学习网站,给大家分享一下~可点击下方链接查看!

人工智能学习网站

继续加油!

在这里插入图片描述

文章目录

    • 个人主页-爱因斯晨
    • 文章专栏-数据结构
    • 人工智能学习网站
    • 一、队列的基本概念
    • 二、队列的核心操作
    • 三、C 语言实现队列
      • 3.1 顺序队列(数组实现)
    • 3.2 链式队列(链表实现)
    • 四、队列的应用场景
    • 五、两种实现的对比选择

一、队列的基本概念

队列是一种先进先出(FIFO,First In First Out) 的线性数据结构,仅允许在一端进行插入操作(队尾),另一端进行删除操作(队头)。

生活中的队列场景:

  • 银行窗口排队办理业务

  • 打印机任务队列

  • 消息队列中的消息传递

二、队列的核心操作

  1. 初始化(InitQueue:创建一个空队列

  2. 入队(EnQueue:在队尾插入元素

  3. 出队(DeQueue:从队头删除元素

  4. 获取队头元素(GetFront:返回队头元素值

  5. 判空(IsEmpty:判断队列是否为空

  6. 销毁(DestroyQueue:释放队列占用的内存

三、C 语言实现队列

3.1 顺序队列(数组实现)

顺序队列使用数组存储元素,通过队头指针(front)和队尾指针(rear)标记队列边界。

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100  // 队列最大容量

// 顺序队列结构体
typedef struct {
    int data[MAX_SIZE];
    int front;  // 队头指针(指向队头元素)
    int rear;   // 队尾指针(指向队尾元素的下一个位置)
} SeqQueue;

// 初始化队列
void InitQueue(SeqQueue *q) {
    q->front = 0;
    q->rear = 0;
}

// 判空
int IsEmpty(SeqQueue *q) {
    return q->front == q->rear;
}

// 判满
int IsFull(SeqQueue *q) {
    return (q->rear + 1) % MAX_SIZE == q->front;  // 预留一个空间区分空满
}

// 入队
int EnQueue(SeqQueue *q, int value) {
    if (IsFull(q)) {
        printf("队列已满,无法入队\n");
        return 0;  // 入队失败
    }
    q->data[q->rear] = value;
    q->rear = (q->rear + 1) % MAX_SIZE;  // 循环移动队尾指针
    return 1;  // 入队成功
}

// 出队
int DeQueue(SeqQueue *q, int *value) {
    if (IsEmpty(q)) {
        printf("队列为空,无法出队\n");
        return 0;  // 出队失败
    }
    *value = q->data[q->front];
    q->front = (q->front + 1) % MAX_SIZE;  // 循环移动队头指针
    return 1;  // 出队成功
}

// 获取队头元素
int GetFront(SeqQueue *q, int *value) {
    if (IsEmpty(q)) {
        printf("队列为空,无队头元素\n");
        return 0;
    }
    *value = q->data[q->front];
    return 1;
}

// 测试顺序队列
int main() {
    SeqQueue q;
    InitQueue(&q);

    // 入队操作
    EnQueue(&q, 10);
    EnQueue(&q, 20);
    EnQueue(&q, 30);

    // 获取队头元素
    int frontVal;
    GetFront(&q, &frontVal);
    printf("队头元素:%d\n", frontVal);  // 输出:10

    // 出队操作
    int deVal;
    DeQueue(&q, &deVal);
    printf("出队元素:%d\n", deVal);  // 输出:10

    // 再次获取队头
    GetFront(&q, &frontVal);
    printf("新队头元素:%d\n", frontVal);  // 输出:20

    return 0;
}

顺序队列特点

  • 优点:实现简单,访问速度快

  • 缺点:容量固定,存在 “假溢出” 问题(需用循环队列优化)

3.2 链式队列(链表实现)

链式队列使用链表存储元素,队头指针指向头节点,队尾指针指向尾节点。

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

// 节点结构体
typedef struct Node {
    int data;
    struct Node *next;
} Node;

// 链式队列结构体
typedef struct {
    Node *front;  // 队头指针(指向头节点)
    Node *rear;   // 队尾指针(指向尾节点)
} LinkQueue;

// 初始化队列
void InitQueue(LinkQueue *q) {
    // 创建头节点(不存储数据)
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    q->front = head;
    q->rear = head;
}

// 判空
int IsEmpty(LinkQueue *q) {
    return q->front == q->rear;
}

// 入队
void EnQueue(LinkQueue *q, int value) {
    // 创建新节点
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = NULL;

    // 插入到队尾
    q->rear->next = newNode;
    q->rear = newNode;  // 更新队尾指针
}

// 出队
int DeQueue(LinkQueue *q, int *value) {
    if (IsEmpty(q)) {
        printf("队列为空,无法出队\n");
        return 0;
    }

    Node *temp = q->front->next;  // 待删除节点
    *value = temp->data;
    q->front->next = temp->next;

    // 如果删除的是最后一个节点,需更新队尾指针
    if (q->rear == temp) {
        q->rear = q->front;
    }

    free(temp);  // 释放节点内存
    return 1;
}

// 获取队头元素
int GetFront(LinkQueue *q, int *value) {
    if (IsEmpty(q)) {
        printf("队列为空,无队头元素\n");
        return 0;
    }
    *value = q->front->next->data;
    return 1;
}

// 销毁队列
void DestroyQueue(LinkQueue *q) {
    // 释放所有节点
    while (q->front != NULL) {
        q->rear = q->front->next;
        free(q->front);
        q->front = q->rear;
    }
}

// 测试链式队列
int main() {
    LinkQueue q;
    InitQueue(&q);

    // 入队
    EnQueue(&q, 100);
    EnQueue(&q, 200);
    EnQueue(&q, 300);

    // 获取队头
    int frontVal;
    GetFront(&q, &frontVal);
    printf("队头元素:%d\n", frontVal);  // 输出:100

    // 出队
    int deVal;
    DeQueue(&q, &deVal);
    printf("出队元素:%d\n", deVal);  // 输出:100

    // 销毁队列
    DestroyQueue(&q);
    return 0;
}

链式队列特点

  • 优点:容量动态扩展,不存在溢出问题

  • 缺点:需要额外空间存储指针,操作稍复杂

四、队列的应用场景

  1. 广度优先搜索(BFS) :在二叉树层次遍历、图的遍历中常用

  2. 缓冲处理 :如键盘输入缓冲、网络数据接收缓冲

  3. 任务调度 :操作系统中的进程调度、线程池任务调度

  4. 消息传递 :分布式系统中的消息队列(如 RabbitMQ)

五、两种实现的对比选择

场景 推荐实现 理由
已知数据量且固定 顺序队列 效率更高,无需额外指针开销
数据量动态变化 链式队列 避免空间浪费和溢出问题
频繁插入删除 链式队列 操作更高效(O (1) 时间复杂度)
对内存使用敏感 顺序队列 内存连续分配,缓存利用率高

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13680.html

(0)
LomuLomu
上一篇 2025 年 9 月 19 日
下一篇 2025 年 9 月 19 日

相关推荐

  • Java 技术全景 —— 运用 Java 实现城市交通大数据可视化分析与智能治理方案(191)

    ✨尊敬的读者朋友们,诚挚欢迎您访问【智汇科技园】!在这个数字化浪潮奔涌的时代,我们致力于打造一个融合创新技术与实践应用的交流平台。本博客将持续为您呈现前沿技术解析与实战案例,期待与您共同探索科技发展的无限可能!✨全网平台(微信公众号/CSDN/抖音/华为/支付宝/微博):智汇科技一、欢迎加入【技术精英圈】快速加入通道1:【智汇技术精英社群(最新)】快速加入通…

    2025 年 5 月 11 日
    44200
  • 永久免费申请最新版最新idea激活码和破解教程

    免责声明:以下补丁与激活码均来自互联网公开分享,仅限个人学习研究,禁止商业用途。若条件允许,请支持正版:https://panghu.hicxy.com/shop/?id=18 先放一张“战果”图:IDEA 2025.2.1 已顺利激活到 2099 年,稳! 下面用图文方式手把手演示最新版 IntelliJ IDEA 的激活流程。 嫌折腾?官方正版全家桶低至…

    IDEA破解教程 2025 年 10 月 23 日
    35600
  • 2024 WebStorm最新激活码,WebStorm永久免费激活码2025-02-10 更新

    WebStorm 2024最新激活码 以下是最新的WebStorm激活码,更新时间:2025-02-10 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 WebStorm 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 …

    2025 年 2 月 10 日
    68200
  • 2025年最新DataGrip激活码与永久破解教程(支持2099年)

    本方法适用于JetBrains全家桶,包括DataGrip、PyCharm、IDEA、Goland等所有产品! 先来看下最新DataGrip版本成功破解的截图,可以看到已经完美激活到2099年,非常稳定可靠! 下面我将通过详细的图文步骤,手把手教你如何将DataGrip永久激活至2099年。 这个方法不仅适用于最新版本,也兼容所有历史版本! 无论你使用Win…

    DataGrip激活码 2025 年 8 月 24 日
    48100
  • 详细分步教学最新版goland激活码申领和全新破解教程

    免责声明:下文所述 GoLand 破解补丁、激活码均搜集自互联网,仅供个人学习与研究,禁止商业用途。若条件允许,请支持正版! 先放一张实测图:GoLand 2025.2.1 已顺利激活至 2099 年,爽歪歪! 下面用图文方式带你一步步搞定最新版 GoLand 的“永久”激活。 前期准备 若你之前尝试过其他补丁却失败,建议先卸载干净再重装;或者手动清理旧配置…

    2025 年 10 月 22 日
    32700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信