「数据结构」队列
目录
队列的基本概念
队列的实现
头文件queue.h
实现函数接口
1.初始化和销毁
2.出队列和入队列
3.获取队头元素和队尾元素
4.队列长度+判空
后记
前言
欢迎大家来到小鸥的博客~
个人主页:海盗猫鸥
本篇专题:数据结构
多谢大家的支持啦!
上一篇关于数据结构的博客中我们讲解了栈,本篇我们就来讲讲队列吧!
队列的基本概念
- 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)
- 入队列:进行插入操作的一端称为队尾
- 出队列:进行删除操作的一端称为队头

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
如果使用数组,每次出队列之后,都需要移动数据,消耗较大。
所以本篇使用单链表实现队列,因为头删和尾插刚好可以满足队列的需要,单链表消耗最大的就是尾删后遍历查找新尾节点,但队列不需要尾删,所以不存在这个问题。
队列的入队列顺序和出队列顺序一定是相同的。
队列的实现
队列的C语言实现,我们要实现的函数和实现栈是差不多的:
只是其存放数据的数据结构变为了一个链表
头文件queue.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int QueueDataType;typedef struct QueueNode
{QueueDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化和销毁
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);//入队列和出队列
void QueuePush(Queue* pq, QueueDataType x);
void QueuePop(Queue* pq);//队头元素和队尾元素
QueueDataType QueueFront(Queue* pq);
QueueDataType QueueBack(Queue* pq);//队列长度函数
int QueueSize(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);
这里我们除了定义了链表节点的结构体QueueNode之外,我们还额外创建了一个Queue的结构体,这个结构体是用来存放队列的一些信息的,phead指向队头,ptail则指向队尾,这样进行入栈和出栈的操作时,就可以直接通过这俩个指针直接对链表进行头删和尾插操作,从而实现出队列和入队列操作,;size则表示队列的数据个数。
实现函数接口
1.初始化和销毁
因为我们是通过Queue结构体来操作队列的,所以不论初始化还是后面的函数都需要的是Queue*类型的指针;
//初始化和销毁
void QueueInit(Queue* pq)
{assert(pq);pq->size = 0;pq->phead = pq->ptail = NULL;
}
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}
由于是本质是一个链表结构,所以在释放空间时,需要遍历链表进行释放。
2.出队列和入队列
队列入数据只能从队尾插入;出数据只能从队头出。
//入队列(尾插)
void QueuePush(Queue* pq, QueueDataType x)
{assert(pq);//动态申请空间创建空间QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!");return;}newnode->data = x;newnode->next = NULL;//没有节点时if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else//存在节点{pq->ptail->next = newnode;pq->ptail = newnode;}//队列长度pq->size++;
}
//出队列(头删)
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead != NULL);//只有一个节点if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else//多个节点{QNode* newhead = pq->phead->next;free(pq->phead);pq->phead = newhead;}pq->size--;
}
入队列和出队列就是运用的链表的尾插和头删的逻辑。
3.获取队头元素和队尾元素
//队头元素和队尾元素
QueueDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead != NULL);return pq->phead->data;
}
QueueDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail != NULL);return pq->ptail->data;
}
由于我们的Queue结构体中就存储了队头和队尾的地址,所以这两个函数就可以直接返回对应的数据。
4.队列长度+判空
//队列长度函数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return !(pq->size);
}
Queue结构体中的size就是在这里起作用的,如果没有size这个成员,就需要遍历链表来实现。
后记
本篇队列的介绍和C语言实现就结束啦!
下篇我们将讲解几道栈和队列的相关OJ题,大家不见不散哦!
那么我们下次见~
相关文章:
「数据结构」队列
目录 队列的基本概念 队列的实现 头文件queue.h 实现函数接口 1.初始化和销毁 2.出队列和入队列 3.获取队头元素和队尾元素 4.队列长度判空 后记 前言 欢迎大家来到小鸥的博客~ 个人主页:海盗猫鸥 本篇专题:数据结构 多谢大家的支持啦ÿ…...
Python01 注释,关键字,变量,数据类型,格式化输出
# 导入模块 import keyword# 我的第一个Python程序 这是单行注释 快捷键:CTRL/这里是多行注释 可以写多行,用 三个单引号 包起来print(Hello work) print(你好,中国)aa 这是不是注释了,是多行文本。print(aa)# 快速创建 python …...
基于单片机智能防触电装置的研究与设计
摘 要 : 针对潮湿天气下配电线路附近易发生触电事故等问题 , 对单片机的控制算法进行了研究 , 设 计 了 一 种 基 于 单片机的野外智能防触电装置。 首先建立了该装置的整体结构框架 , 再分别进行硬件设计和软件流程分析 …...
机械行业工程设计资质乙级需要哪些人员
申请机械行业工程设计资质乙级需要的人员主要包括以下几个方面,具体要求和数量根据参考文章归纳如下: 一、主要专业技术人员 数量要求:主要专业技术人员数量应不少于所申请行业资质标准中主要专业技术人员配备表规定的人数。学历和职称要求…...
vivado改变波形图窗口颜色
点击右上角的设置图标 翻译对照...
蓝桥杯练习系统(算法训练)ALGO-932 低阶行列式计算
资源限制 内存限制:64.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 给出一个n阶行列式(1<n<9),求出它的值。 输入格式 第一行给出两个正整数n,p; 接下来n行&…...
四川古力未来科技抖音小店安全靠谱,购物新体验
在数字化浪潮席卷而来的今天,电商行业蓬勃发展,各种线上购物平台如雨后春笋般涌现。其中,抖音小店凭借其独特的短视频直播购物模式,迅速赢得了广大消费者的青睐。而四川古力未来科技抖音小店,更是以其安全靠谱、品质保…...
深入理解Seata:分布式事务的解决方案
在现代的微服务架构中,随着业务系统的不断拆分和模块化,分布式事务成为一个重要的挑战。为了解决微服务架构下的分布式事务问题,Seata应运而生。Seata(Simple Extensible Autonomous Transaction Architecture)是一款开…...
【TC8】如何测试IOP中PHY芯片的Llink-up time
在TC8一致性测试用例中,物理层的测试用例分为两个部分:IOP和PMA。其中IOP中对PHY芯片的Link-up时间的测试,又包含三个测试用例。它们分别是: OABR_LINKUP_01: Link-up time - Trigger: Power on Link PartnerOABR_LINKUP_02: Link-up time - Trigger: Power on DUTOABR_LIN…...
java大学城水电管理系统源码(springboot)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的大学城水电管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 大学城水电管理系统的…...
LAMP源码编译安装——CentOS7
文章目录 LAMP是什么LAMP软件组件LinuxApacheMySQLPHP 源码安装Apache一、准备工作二、安装环境依赖包三、配置软件模块四、编译及安装五、优化配置文件路径六、添加httpd系统服务(有两种方法)方法一:方法二: 七、修改httpd 服务配…...
oracle 还原被覆盖的视图
1.现在的视图 select to_lob(text) from SYS.DBA_views where view_nameXXX; 2.查旧数据 --as of timestamp to_date(2024-05-28 10:30:00,yyyy-mm-dd hh24:mi:ss) select to_lob(text) from SYS.DBA_views as of timestamp to_date(2024-05-28 10:30:00,yyyy-mm-dd hh24:mi:s…...
go语言同一包中的同一变量实现不同平台设置不同的默认值 //go:build 编译语法使用示例
在使用go来开发跨平台应用的时候,比如配置文件的路径,我们希望设置一个默认值,windows下的路径是类似 d:\myapp\app.conf 这样的, unix系统中的路径是 /opt/myapp/app.conf 这样的, 而我们在使用的时候需要使用的是同…...
校园周边美食探索及分享平台,基于 SpringBoot+Vue+MySQL 开发的前后端分离的校园周边美食探索及分享平台设计实现
目录 一. 前言 二. 功能模块 2.1. 前台首页功能模块 2.2. 用户功能模块 2.3. 管理员功能模块 三. 部分代码实现 四. 源码下载 一. 前言 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起࿰…...
Discourse 编辑没有办法显示更多的 JS 错误
Priority/Severity: High Platform: 3.3.0.beta3-dev UI bugs Description: 昨天升级的时到最新版本的时候就发现有这个错误,是 JS 的错误。 发了一个帖子到官方的网站上,官方说可能是插件的问题。 但是我们实在是没有安装什么插件呀? 官方…...
CSS实现一个雨滴滑落效果
使用纯CSS来实现一个真实的雨滴滑落效果可能会有些挑战,因为CSS主要关注于静态样式和简单的动画效果。然而,你可以使用CSS动画和keyframes来模拟一个雨滴滑落的简化效果。 以下是一个基本的示例,展示如何使用CSS来模拟雨滴从顶部滑落到底部的…...
vue2+echarts地图下钻+地图遮盖物散点
一、下载工具 npm i echarts echarts-gl axios -S -S是生产依赖默认是-S不写也可以 -D是开发依赖 二、引入工具 import * as echarts from "echarts"; import "echarts-gl"; import axios from "axios"; 三、HTML部分代码 <div class&…...
关于C++的特殊类定制
特殊类定制 在C中,一些特殊性质的类如何设计 类禁止拷贝的对象 C11 使用delete关键字赋值给拷贝构造和赋值C98将拷贝构造和赋值声明在私有里 类只能在堆上创建的对象 将构造函数私有化, 提供一个获取对象堆上创建对象的公有函数将析构函数私有化, 提供一个释放…...
Linux备份脚本
作用 Linux文件备份的作用较多,推荐以下几种: 保护文件:备份可以帮助用户保护文件,防止文件被意外删除或损坏。保证系统安全和应用安全:Linux系统管理人员对系统和业务应用要有一个合理的备份恢复策略,完…...
【Unity】实现轮盘抽奖
简介 示例一:使用协程完成轮盘转动 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class Lunpan : MonoBehaviour {[Tooltip("轮盘节点")]public Transform Roulette;[Tooltip("轮盘旋转的…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

