数据结构--队列【详解】~(˶‾᷄ꈊ‾᷅˵)~

目录

队列定义:

 队列的声明与头文件的包含:

队列的声明: 

头文件的包含: 

队列的基本操作: 

初始化队列 : 

 摧毁队列:

 入队列:

 出队列:

返回队头数据:

返回队尾数据:

返回队列当前大小:

判空操作:

测试数据: 

最后,完整代码:


队列定义:

队列是一个先进先出的数据结构(First in First out)。只能对表尾进行插入,对表头进行结点的删除,这样强限制性的链表,这就是所说的队列。也就是说,队列是限定在表的一端进行插入,表的另一端进行删除的数据结构。

图解:

 如同日常生活中去买票排队,每一列队伍都有一个队尾和队首,先来的先买票,后来的后买,买好的就从队首出去,新来买票的就需要从队尾继续排队。

为了使用的方便,咱们将队头位置的指针命名为head,队尾为tail 

 队列的声明与头文件的包含:

队列的声明: 

typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue//定义类型为QNode的指向队头和队尾的指针
{QNode* head;QNode* tail;
}Queue;

这里通过单链表实现队列,需要一个单链表的结构QueueNode。然后头尾指针需要另外开辟一个结构体,指针的类型是QNode*. 通过指针head和tail来查询队列中的队头和队尾数据。

头文件的包含: 

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

队列的基本操作: 

//初始化队列
void QueueInit(Queue* pq);
//摧毁队列
void QueueDestory(Queue* pq);//入队列
void QueuePush(Queue* pq, QDataType x);
//出队列
void QueuePop(Queue* pq);
//返回队头数据
QDataType QueueFront(Queue* pq);
//返回队尾数据
QDataType QueueBack(Queue* pq);
//返回队列当前大小
int QueueSize(Queue* pq);
//判空操作
bool QueueEmpty(Queue* pq);

 

初始化队列 : 

void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;//将指向队头和队尾的指针置空
}

 摧毁队列:

void QueueDestory(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;//保存下一个节点的指针,释放当亲位置的空间free(cur);cur = next;}pq->head = pq->tail = NULL;//释放完后将队头和队尾指针都置空
}

 入队列:

void QueuePush(Queue* pq,QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL)//为新节点开辟空间{printf("malloc fail\n");exit(-1);}newnode->data = x;newnode->next = NULL;//为新节点赋值if (pq->tail == NULL)//若当前尾为空,就将队头,尾指针指向newnode{pq->tail = pq->head = newnode;}else{pq->tail->next = newnode;//否则队尾指针的next指向newnodepq->tail = newnode;}
}

1.入队列前需要开辟一个新节点,同时进行判空操作

2.进行入队操作的时候,首先需要判断队列是否为空,如果队列为空的话,需要将头指针和尾指针一同指向第一个结点 

3.如果不为空,就进行队列的尾插操作,同时移动tail的位置以便于下一次的插入

 

 出队列:

void QueuePop(Queue* pq)
{assert(pq);//一个if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}//多个else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}
}

出队列是需要判断当前队列中的节点个数,分为一个和多个进行讨论。如果只有一个,就将头节点内存释放,接着将头尾指针置空,防止野指针的出现。如果是多个节点,就需要将头节点的下一个节点保存,以免找不到。接着将头节点内存释放,释放后,移动头指针head的位置,使其指向下一个节点。 

返回队头数据:

QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->head);return pq->head->data;
}

返回队尾数据:

QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->head);return pq->tail->data;
}

返回队列当前大小:

int QueueSize(Queue* pq)
{assert(pq);int size = 0;QNode* cur = pq->head;while (cur){size++;cur = cur->next;}return size;
}

判空操作:

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL;
}

测试数据: 

 

最后,完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue//定义类型为QNode的指向队头和队尾的指针
{QNode* head;QNode* tail;
}Queue;
//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;//将指向队头和队尾的指针置空
}
//摧毁队列
void QueueDestory(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;//保存下一个节点的指针,释放当亲位置的空间free(cur);cur = next;}pq->head = pq->tail = NULL;//释放完后将队头和队尾指针都置空
}
//入队列
void QueuePush(Queue* pq,QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL)//为新节点开辟空间{printf("malloc fail\n");exit(-1);}newnode->data = x;newnode->next = NULL;//为新节点赋值if (pq->tail == NULL)//若当前尾为空,就将队头,尾指针指向newnode{pq->tail = pq->head = newnode;}else{pq->tail->next = newnode;//否则队尾指针的next指向newnodepq->tail = newnode;}
}
//出队列
void QueuePop(Queue* pq)
{assert(pq);//一个if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}//多个else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}
}
//返回队头数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->head);return pq->head->data;
}
//返回队尾数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->head);return pq->tail->data;
}
//返回队列当前大小
int QueueSize(Queue* pq)
{assert(pq);int size = 0;QNode* cur = pq->head;while (cur){size++;cur = cur->next;}return size;
}
//判空操作
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL;
}void QueueTest()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);printf("%d ", QueueFront(&q));QueuePop(&q);printf("%d ", QueueFront(&q));QueuePop(&q);QueuePush(&q, 3);QueuePush(&q, 4);while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}printf("\n");QueueDestory(&q);
}
int main()
{QueueTest();return 0;
}

 博客到这里也是结束了,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js使用jemalloc内存分配器显著减少内存使用

前言 Node.js 默认使用的是 ptmalloc(glibc) 内存分配器&#xff0c;而&#xff1a; 在服务端领域「不会选择默认的 malloc」是一个常识。&#xff08; 来源 &#xff09; ptmalloc 的分配效率较低&#xff08; 来源 &#xff09;&#xff0c;对于 长时间、多核 / 多线程 运行…

算法训练day56|动态规划part16

583. 两个字符串的删除操作 逆向思路&#xff1a;求最长公共子序列&#xff0c;在用总长度-2*公共子序列长度 正向思路&#xff1a;删除多少 1. dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结…

JDBC->SpringJDBC->Mybatis封装JDBC

一、JDBC介绍 Java数据库连接&#xff0c;&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们…

polar CTF WEB-veryphp

1、题目 <?php error_reporting(0); highlight_file(__FILE__); include("config.php"); class qwq {function __wakeup(){die("Access Denied!");}static function oao(){show_source("config.php");} } $str file_get_contents("ph…

【快速全面掌握 WAMPServer】11.安装 PHP 扩展踩过的坑

网管小贾 / sysadm.cc 我们在调试程序代码时&#xff0c;总会遇到一些 PHP 项目需要某些扩展组件。 而在 WAMPServer 下通常的 PHP 扩展的安装也不算有多麻烦。 具体关于 PHP 扩展的区分&#xff08;比如安全线程或非安全线程&#xff09;&#xff0c;以及怎么安装小伙伴们可…

TDD-LTE 寻呼流程

目录 1. 寻呼成功流程 1.1 空闲态寻呼 1.2 连接态寻呼 2. 寻呼失败流程 2.1 Paging消息不可达 2.2 RRC建立失败 2.3 eNodeB未上发Initial UE message或达到超时 1. 寻呼成功流程 1.1 空闲态寻呼 寻呼成功&#xff1a;MME发起寻呼&#xff08;S1 接口发送Paing 消息&…

blender mix节点和它的混合模式

Mix 节点是一种用于混合两个颜色或者两个图像的节点&#xff0c;它有以下几个输入和输出&#xff1a; Color1&#xff1a;用于接收第一个颜色或者图像&#xff0c;也就是基色。Color2&#xff1a;用于接收第二个颜色或者图像&#xff0c;也就是混合色。Fac&#xff1a;用于控制…

Kasada p.js (x-kpsdk-cd、x-kpsdk-ct、integrity)

提供x-kpsdk-cd的API服务 详细请私信~ 可试用~ V:zhzhsgg 一、简述 integrity是通过身份验证Kasada检测机器人流量后获得的一个检测结果&#xff08;数据完整性&#xff09; x-kpsdk-cd 是经过编码计算等等获得。当你得到正确的解决验证码值之后&#xff0c;解码会看到如下图…

Excel报表框架(ExcelReport)极简化解决复杂报表导出问题

Excel Report 耗费了半个月的时间&#xff0c;终于在元旦这三天把报表框架开发完成了&#xff0c;使用该框架你可以非常方便的导出复杂的Excel报表。 项目开源地址&#xff1a; GiteeGithub 前言 不知道各位在使用POI开发报表导出过程中遇到过以下的情况&#xff1a; 频繁…

react + redux 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地&#xff08;内置了基础静态组件和模版&#xff09; git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务&#xff08;内置了json-server&#xff09; npm run serve 启动前端服务 npm…

ES6之Proxy详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

六、Redis 分布式系统 —— 超详细操作演示!

六、Redis 分布式系统 —— 超详细操作演示&#xff01; 六、Redis 分布式系统6.1 数据分区算法6.1.1 顺序分区6.1.2 哈希分区 6.2 系统搭建与运行6.2.1 系统搭建6.2.2 系统启动与关闭 6.3 集群操作6.3.1 连接集群6.3.2 写入数据6.3.3 集群查询6.3.4 故障转移6.3.5 集群扩容6.3…

BGP路由知识点

目录 1.BGP的工作原理&#xff1a; 2.BGP路由的一般格式&#xff1a; 3.三种不同的自治系统AS 4.BGP的路由选择 5.BGP的四种报文 BGP&#xff08;Border Gateway Protocol&#xff09;是一种用于自治系统&#xff08;AS&#xff09;之间的路由选择协议。它是互联网中最常用…

Spark SQL中的聚合与窗口函数

Spark SQL是Apache Spark的一个模块&#xff0c;用于处理结构化数据。在数据分析和处理中&#xff0c;聚合和窗口函数是非常重要的工具&#xff0c;它们可以对数据进行各种汇总、计算和分析。本文将深入探讨Spark SQL中的聚合与窗口函数&#xff0c;包括聚合函数、分组操作、窗…

算法训练营Day34(贪心算法)

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 秒了 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {Arrays.sort(nums);// -4 -3 -2 -1 5//-2 -2 0 2 5int last -1;for(int i 0;i<…

【JavaFX】基于JavaFX11 构建可编辑、对象存储、修改立即保存、支持条件过滤的TableView

文章目录 效果设计思路二、使用步骤前提:自定义TableView的失去焦点事件1. 创建实体类2.读取本地文件数据3. 定义表格TableView总结效果 如图所示,这是一个存储application.properties内容的表格。这里的文件application.properties是从Linux服务器上获取来的。 当点击检索按…

【算法】使用位运算解算法题(C++)

文章目录 0. 位运算 基本介绍1. 位运算基本使用 连带题目191.位1的个数338.比特位计数461.汉明距离136.只出现一次的数字260.只出现一次的数字III 2. 使用位运算解决算法题面试题01.01.判定字符是否唯一371.两整数之和137.只出现一次的数字II面试题17.04.消失的数字面试题17.1…

SDG大数据平台简介

联合国可持续发展目标&#xff08;Sustainable Development Goals&#xff09;缩写SDGs&#xff0c;是联合国制定的17个全球发展目标&#xff0c;在2000-2015年千年发展目标&#xff08;MDGs&#xff09;到期之后继续指导2015-2030年的全球发展工作。&#xff08;摘自百度&…

React学习计划-React16--React基础(八)react-redux使用与优化,纯函数介绍

笔记gitee地址 学习了 redux,为什么还要讲react-redux呢&#xff1f; redux不是专门为react所创建的,只不过在某一刻&#xff0c;react和redux看对眼了&#xff0c;所以俩人走到了一起&#xff0c;所以为了更好的支持redux,react官方出了react-redux来更好的支持redux 1. react…

Couchdb 垂直权限绕过漏洞(CVE-2017-12635)

一、漏洞描述 Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为”完全拥抱web的数据库”。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台…