【C数据结构】队列_Queue

news2024/11/17 4:29:21

目录

队列_Queue

【1】队列的概念及结构

【2】节点队列的实现

【2.1】队列的各个接口

【2.2】队列的初始化

【2.3】队列栈的释放

【2.4】队尾入队列

【2.5】队头出队列

【2.6】获取队列头部元素

【2.7】获取队列尾部元素

【2.8】获取队列中有效元素个数

【2.9】检测队列是否为空


队列_Queue

【1】队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 。

栈符合后进先出(First In First Out )

【2】节点队列的实现

        队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

【2.1】队列的各个接口

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


// 栈数据结构定义 ///
/* 栈数据结构 */
typedef int QDataType;
typedef struct QListNode {
    QDataType _data;
    struct QListNode *_nextNode;
}QNode;

typedef struct Queue {
    QNode* _head;
    QNode* _tail;
    size_t _size;
}Q;


// 栈常用接口定义 ///
/* 队列:初始化 */ 
void QueueInit(Q* q);

/* 队列:销毁 */
void QueueDestroy(Q* q);

/* 队列:尾插 */
void QueuePush(Q* q, QDataType val);

/* 队列:头出 */
void QueuePop(Q* q);

/* 队列:获取头部数据 */
QDataType QueueFront(Q* q);

/* 队列:获取尾部数据 */
QDataType QueueBack(Q* q);

/* 队列:获取队列有效元素个数 */
size_t QueueSize(Q* q);

/* 队列:检查是否为空栈 */
bool QueueEmpty(Q* q);

【2.2】队列的初始化

/* 队列:初始化 */
void QueueInit(Q* q) {
    // 断言
    assert(q);

    // 初始化
    q->_head = q->_tail = NULL;
    q->_size = 0;
}

【2.3】队列栈的释放

/* 队列:销毁 */
void QueueDestroy(Q* q) {
    // 断言
    assert(q);

    // 遍历释放
    QNode* pCur = q->_head;
    while (pCur != NULL) {
        QNode* pDel = pCur;
        pCur = pCur->_nextNode;

        free(pDel); pDel = NULL;
    }

    // 初始化
    q->_head = q->_tail = NULL;
    q->_size = 0;
}

【2.4】队尾入队列

  • 入队列动画演示

 

  • 入队会出现两种情况

 

/* 队列:尾插 */
void QueuePush(Q* q, QDataType val) {
    // 断言
    assert(q);

    // 开辟节点
    QNode* newNode = (QNode*)malloc(sizeof(QNode));
    // 开辟失败
    if (newNode == NULL) {
        perror("malloc fail!");
        exit(-1);
    }
    // 开辟成功
    else
    {
        newNode->_data = val;
        newNode->_nextNode = NULL;
    }

    // 插入数据
    // 链表为空
    if (q->_tail == NULL) {
        q->_head = q->_tail = newNode;
    }
    // 链表不为空
    else
    {
        q->_tail->_nextNode = newNode;
        q->_tail = q->_tail->_nextNode;
    }
    // 记录数据个数
    q->_size++;
}

【2.5】队头出队列

/* 队列:头出 */
void QueuePop(Q* q) {
    // 断言
    assert(q);

    // 链表剩余最后一个节点数据
    if (q->_head->_nextNode == NULL) {
        free(q->_head);  
        q->_head = q->_tail = NULL;
    }
    // 链表有很多数据
    else
    {
        QNode* pDel = q->_head;
        q->_head = q->_head->_nextNode;
        free(pDel); pDel = NULL;
    }
}

【2.6】获取队列头部元素

/* 队列:获取头部数据 */
QDataType QueueFront(Q* q) {
    // 断言
    assert(q);
    // 检测是否是空
    assert(!QueueEmpty(q));
    return q->_head->_data;
}

【2.7】获取队列尾部元素

/* 队列:获取尾部数据 */
QDataType QueueBack(Q* q) {
    // 断言
    assert(q);
    // 检测是否是空
    assert(!QueueEmpty(q));
    return q->_tail->_data;
}

【2.8】获取队列中有效元素个数

/* 队列:获取队列有效元素个数 */
size_t QueueSize(Q* q) {
    // 断言
    assert(q);
    return q->_size;
}

【2.9】检测队列是否为空

/* 队列:检查是否为空栈 */
bool QueueEmpty(Q* q) {
    // 断言
    assert(q);
    return q->_head == NULL && q->_tail == NULL;
}

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

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

相关文章

图像 检测 - CenterNet: Objects as Points (arXiv 2019)

CenterNet: Objects as Points - 目标作为点&#xff08;arXiv 2019&#xff09; 摘要1. 引言2. 相关工作3. 准备工作4. 目标作为点4.1 3D 检测4.2 人体姿态估计 5. 实施细节6. 实验6.1 目标检测6.1.1 附加实验 6.2 3D 检测6.3 姿态估计 7. 结论References附录A&#xff1a;模型…

Nginx安装Windows、Linux | 正向代理、反向代理、负载均衡

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可用作电子邮件代理服务器和通用TCP/UDP代理服务器。它是一个轻量级的Web服务器&#xff0c;可以作为静…

[进阶]Java:线程概述、线程创建方式

什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。程序中如果只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 多线程是什么&#xff1f; 多线程是指从软硬件上…

【现代数据架构】面向初创公司的现代数据堆栈

“为工作使用正确的工具&#xff01;” 这句话一开始听起来很简单&#xff0c;但在实际方面实施起来却非常复杂。早期的初创公司发现很难选择生态系统中可用的各种工具&#xff0c;因为它们的数据将如何演变是非常不可预测的。 需要现代数据堆栈 在过去 10 年中&#xff0c;软件…

c++11 标准模板(STL)(std::basic_ios)(四)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容 VMware 支持的 OpenStack 发行版&#xff1a;在 VMware 虚拟化技术之上运行企业级 OpenStack 云 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vio-7/&#xff0c;查看最新版。原创…

极易搭建的代码托管平台Gitea

这礼拜有点霉啊&#xff0c;先是日常自用的机器上&#xff0c;SSD 挂了&#xff0c;彻底识别不了的那种 隔了两天&#xff0c;用来写文章用的小机器上&#xff0c; 500G 的机械硬盘也挂了&#xff0c;重新格了一下&#xff0c;挂在玩客云上当个下载盘用吧 好在都有备份&#xf…

[进阶]Java:文件字节输出流、文件拷贝、资源释放

文件字节输出流&#xff08;FileOutputStream&#xff09;写数据出去的API 流的关闭和刷新 代码演示如下&#xff1a; ​​​​​​​ public class OutputStreamDemo04 {public static void main(String[] args) throws Exception {//1.创建一个文件字节输出流管道与目标文件…

WPF开发txt阅读器14:通过C#代码设计UI布局

文章目录 需求分析C#代码UI设计 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进快退&#x1f48…

ad18学习笔记六:ad18官方在线文档

这个挺有用&#xff0c;反正我是没找到离线的、完整的、详细的软件说明文档&#xff0c;只有去官网看在线的&#xff0c;有点卡&#xff0c;还是全英文的。 具体的位置直接进官网&#xff0c;比如这个&#xff1a; Board Region | Altium Designer 18.0 User Manual | Docume…

BOSHIDA AC DC电源模块在光纤通信设备的应用

BOSHIDA AC DC电源模块在光纤通信设备的应用 随着科技的不断发展&#xff0c;光纤通信技术逐渐成为人们日常生活和工作中广泛采用的一项技术。在光纤通信设/备中&#xff0c;稳定的电源模块是其正常运转的关键。AC DC电源模块在光纤通信设/备的应用也越来越广泛。 AC DC电源模…

清华青年AI自强作业hw3_1:用线性回归模型拟合MNIST手写数字分类

清华青年AI自强作业hw3_1&#xff1a;用线性回归模型拟合MNIST手写数字分类 实现过程思路分析逻辑回归二分类模型训练结果分析 相关链接 一起学AI系列博客&#xff1a;目录索引 hw3_1&#xff1a;用线性回归模型拟合MNIST手写数字分类 初步体验Tensorflow编程环境体会用回归模…

HDLBits自学笔记2:Verilog language.Vector

Vectors 建立一个电路&#xff0c;有一个3bit输入&#xff0c;输出这个向量&#xff0c;并将其分割为三个单独的1bit信号输出&#xff0c;电路图如下&#xff1a; module top_module ( input wire [2:0] vec,output wire [2:0] outv,output wire o2,output wire o1,output wir…

【30天熟悉Go语言】8 Go流程控制之循环结构for range、goto、break、continue

文章目录 一、前言二、for循环1、语法1&#xff09;和Java的for循环一样2&#xff09;和Java的while一样3&#xff09;和Java的for(;;)一样 2、for语句执行过程 三、for range1、语法1&#xff09;遍历key、value只遍历value 2&#xff09;遍历key 四、关键字1、break1&#xf…

【Rust日报】2023-06-18 2023第三届中国Rust开发者大会圆满结束

2023第三届中国Rust开发者大会 发布 Mailtutan v0.3.0 - 用于测试和开发环境的 SMTP 服务器 变更日志&#xff1a; 添加数据修剪支持添加邮件目录存储向 API 添加删除消息添加 TLS 支持添加 SMTP 普通身份验证支持 github: https://github.com/mailtutan/mailtutan/ Kani 0.30.…

测试工程师个人简历模板

测试工程师个人简历模板篇1 姓 名&#xff1a; _x 性 别&#xff1a; 男 婚姻状况&#xff1a; 已婚 民 族&#xff1a; 汉族 户 籍&#xff1a; 湖南-岳阳 年 龄&#xff1a; 27 现所在地&#xff1a; 广东-深圳 身 高&#xff1a; 176cm 希望地区&#xff1a; 广东、 广…

Q-learning解决悬崖问题

Q-learning是一个经典的强化学习算法&#xff0c;是一种基于价值(Value-based)的算法&#xff0c;通过维护和更新一个价值表格(Q表格)进行学习和预测。 Q-learning是一种off-policy的策略&#xff0c;也就是说&#xff0c;它的行动策略和Q表格的更新策略是不一样的。 行动时&am…

vue2和vue3组件v-model区别

前言 单向数据流&#xff0c;父组件传给子组件的数据&#xff0c;子组件只能展示&#xff0c;不能修改&#xff0c;如果需要修改则需要emit事件让父组件修改 有些时候&#xff0c;一些组件并不是通过input来进行触发事件。也就是说value和input事件在大多数情况下能够适用&am…

ROS2性能分析

文章&#xff1a;Performance Analysis of ROS2 作者&#xff1a;Deepak Charan Logavaseekaran, Rakshith Macha Billava 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF论文&#xff0c;欢迎转发朋友圈。文章仅做学术分享&#xff0c;如有侵权联系删文。未…

3-dubbo框架,应用程序,模块领域模型Model对象的初始化

在上一章中我们详细看了服务配置ServiceConfig类型的初始化,不过我们跳过了AbstractMethodConfig的构造器中创建模块模型对象的过程 那为什么会在Dubbo3的新版本中加入这个域模型呢,主要有如下原因 之前dubbo都是只有一个作用域的&#xff0c;通过静态类 属性共享 增加域模型是…