news 2026/5/16 1:50:08

队列 手把手教会你

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
队列 手把手教会你

队列 先进 先出 很公平 排队打菜一样

有对头 和 对尾 就是对单链表 限制或者只去用部分的函数 就不要其他的功能 来使其 具有独特的 属性和 应用场景

现实 比喻 嘉豪 男娘 等

1 为什么非要包一个结构体?因为队列必须同时记住:头在哪、尾在哪,不然没法快速入队、出队。

<stdlib.h> 精简版作用
1. 动态内存:malloc、free、calloc、realloc
2. 程序退出:exit()
3. 类型转换:atoi 字符串转整数、atof 转小数
4. 随机数:rand、srand
5. 工具函数:abs 求绝对值、qsort 排序
一句话:C语言内存分配、随机数、类型转换、程序退出都靠它。

每一个 Node 就是一个排队的人

val 是这个人带的东西

next 是伸手指着下一个人

将结构体变量 看作大哥 下面有小弟 大哥可以指挥小弟

Queue 是总管,手里拿着两个指针,盯着队伍头和队伍尾。

方便 头删 出队列 对头

尾插 入队列 队尾

2 第一个初始化函数 —— 队列初始化
思路:刚创建一个队列,队伍里一个人都没有所以:

头指针、尾指针 都赋值为 NULL

3 判空函数 思路:

只要 head == NULL,说明队伍没人,就是空队列。

return pq->Head ==NULL; return !pq->Head;z这里是等价的 但推荐第一种只管 表达式的结果就是返回值 很直观

4 销毁队列

需要从头开始 来写 一个一个遍历之后 销毁 free

5 入队列

*队列结构体已经把 head 和 tail 包起来了,你传 Queue就能修改 head 和 tail,根本不需要二级指针!**

尾插 时的 直接使用 记录好的Tail

6 取数据 对头 队尾

注意 队列判空

7 求 队列中的人数

细节拉满

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

接口函数-

#define _CRT_SECURE_NO_WARNINGS 1 #include "queue.h" //初始化 void QueueInit(Queue* pq) { assert(pq); //pq->val = 0; 对里没人 更不可能有东西呀 pq->Head=pq->Tail = NULL; } // 还有就是销毁 void QueueDestroy(Queue* pq) { assert(pq); Node* cur = pq->Head; while (cur!=NULL) { Node* next = cur->next;//记录下个节点 free(cur);//cur无 cur = next;//狸猫换太子 } pq->Head = pq->Tail = NULL; } // 判空 bool EmptyQueue(Queue* pq) { assert(pq); return pq->Head ==NULL; //return !pq->Head; //return pq->Head !=NULL; //return pq->Head; } // 入队列 尾插 void QueuePush(Queue* pq,QueueDatatype x) { assert(pq); //创建新的节点 Node* newnode = (Node*)malloc(sizeof(Node)); if (newnode == NULL) { perror("malloc error!\n"); return; } newnode->val = x; newnode->next = NULL; //0 节点 if (pq->Head == NULL) { pq->Head = pq->Tail = newnode; } else//至少一节点 尾插 { //Node* Ftail = pq->Head; //while (Ftail->next!=NULL) { // Ftail = Ftail->next; //} //Ftail->next = newnode; //直接使用 pq->Tail->next = newnode; pq->Tail = newnode; } pq->size++;//666 } // 出队 头删除 void QueuePop(Queue* pq) { assert(pq); assert(!EmptyQueue( pq)); Node*del = pq->Head; Node* next = pq->Head->next; free(del); del = NULL; pq->Head = next; if (next == NULL) { pq->Tail = pq->Head = NULL; } pq->size--;///6666 } //取对头 QueueDatatype GotQHead(Queue* pq) { assert(pq); assert(!EmptyQueue(pq)); return pq->Head->val; } // 队尾数 QueueDatatype GotQTail(Queue* pq) { assert(pq); assert(!EmptyQueue(pq)); return pq->Tail->val; } // // 队列中的数据总数 // 每次新增size都加一 o(1) int CountQsize(Queue* pq) { return pq->size; }

头文件

#pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> #include<stdbool.h> typedef int QueueDatatype; //单链表实现 typedef struct Node { QueueDatatype val;//物品 struct Node* next; }Node; //人 typedef struct Queue { Node* Head; int size; Node* Tail; }Queue;

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 1:43:12

Docker Desktop Macbook界面汉化

1、根据自己的版本下载文件&#xff08;下载地址&#xff09; 2、打开访问->前往->前往文件夹&#xff0c;输入目录地址 /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Resources 3、关闭Docker Desktop把下载的app-Mac-apple.asar改名为&am…

作者头像 李华
网站建设 2026/5/16 1:36:25

FineReport纵向,横向扩展

1.纵向扩展和横向扩展横向扩展数据,可以单元格中选择对应数据列,然后选择扩展方向,注意: 上父格:无重点是横向数据按列汇总统计:因为是横向扩展了所以没办法指定单元格SUM(单元格[;!0]) 这是纵向的求和SUM(单元格[!0;]) 这是横向的求和关键: sum(D4[!0;])然后左父格:无 上父格…

作者头像 李华
网站建设 2026/5/16 1:34:25

圣淘沙客服服务中心搭建记录(移动端入口 + 百度SEO优化)

最近在测试一个&#xff1a;移动端客服服务型网站。这次主要方向&#xff1a;* 手机端访问优化 * 在线客服展示 * APP下载入口 * 百度SEO收录 * HTTPS安全访问 * 移动端单页结构测试站&#xff1a;https://shengtaoshakf.com页面主要围绕&#xff1a;* 在线客服 * 官方服务入口…

作者头像 李华
网站建设 2026/5/16 1:34:16

在OpenClaw中快速接入Taotoken实现AI助手功能

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在OpenClaw中快速接入Taotoken实现AI助手功能 OpenClaw是一款功能强大的AI助手工具&#xff0c;能够帮助开发者进行代码生成、问题…

作者头像 李华
网站建设 2026/5/16 1:31:03

Express快速上手

一、前置环境准备 1. 安装 Node.js Express 依赖 Node.js&#xff0c;先安装&#xff1a; 官网&#xff1a;https://nodejs.org/推荐版本&#xff1a;LTS 长期稳定版验证安装&#xff1a; node -v # 查看 Node 版本 npm -v # 查看 npm 版本2. 初始化项目 创建项目文件夹…

作者头像 李华
网站建设 2026/5/16 1:30:06

AWorks嵌入式驱动开发实战:从模型解析到GPIO/UART驱动编写

1. 项目概述&#xff1a;从“裸机”到“框架”的驱动开发范式转变在嵌入式开发领域&#xff0c;设备驱动程序的编写一直是连接硬件与上层应用的关键桥梁。过去&#xff0c;我们习惯于为每一款微控制器&#xff08;MCU&#xff09;或每一个外设模块&#xff0c;从头开始编写寄存…

作者头像 李华