栈和队列之队列

1.队列

1.1队列的概念

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

1.2队列的实现

1.准备工作

还是三个文件

头文件中需要包含库函数等

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int QDataType;
//表示队列
typedef struct QueueNode
{int val;struct QueueNode* next;
}QNode;
//队列的结构
typedef struct Queue
{QNode* phead;//头结点指针QNode* ptail;//尾结点指针int size;
}Queue;//初始化
void QueueInit(Queue* qp);
//销毁
void QueueDestory(Queue* qp);
//入队列
void QueuePush(Queue* qp,QDataType x);//出队列
void QueuePop(Queue* qp);
//获取队列头部元素
QDataType QueueFront(Queue* qp);
//获取队列尾部元素
QDataType QueueBack(Queue* qp);
//判断是否为空
bool QueueEmpty(Queue* qp);
//获取队列的有效元数个数
int QueueSize(Queue* qp);

2.初始化队列

初始化队列和初始化栈其实差不多

都是先把指针置为空

然后再将数据置为0

//初始化
void QueueInit(Queue* qp)
{assert(qp);qp->phead = NULL;qp->ptail = NULL;qp->size = 0;}

3.销毁队列

销毁队列的话

就是遍历队列,然后将队列中的指针给free掉

并置为空

数据也置为0

void QueueDestory(Queue* qp)
{assert(qp);QNode* cur = qp->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}qp->phead = qp->ptail = NULL;qp->size = 0;}

4.入队列

首先需要开辟空间

然后检测开辟的空间否为开辟成功

然后就是把数据x传入到val中

让next置为空

如果尾结点不为空,那么就让他的next去指向新的节点,再让新开辟的成为尾结点

并让size++

void QueuePush(Queue* qp, QDataType x)
{assert(qp);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("mallco fall");return;}newnode->val = x;newnode->next = NULL;if (qp->ptail){qp->ptail->next = newnode;qp->ptail = newnode;}else{qp->phead = qp->ptail = newnode;}qp->size++;
}

5.出队列

出队列的话我们需要检测一下,分为多个情况

0  1和多

首先是0个节点

没有节点的话我们需要断言头结点是否为空

一个节点的话,我们需要判断他的头结点的next是否为空

是就是一个节点

那么我们需要释放掉头结点,让头和尾都为空

多个节点的话就需要创建一个新节点

让头结点的next指向新的节点

然后free掉头结点

让新节点成为头结点

最后让size--

void QueuePop(Queue* qp)
{assert(qp);//多种情况,0个节点,一个节点和多个节点温柔检查//if (qp->phead == NULL)//{//	return;//}//暴力检查,0个节点assert(qp->phead != NULL);//一个节点if (qp->phead->next == NULL){free(qp->phead);qp->phead = qp->ptail = NULL;}//多个节点else{QNode* next = qp->phead->next;free(qp->phead);qp->phead = next;}qp->size--;}

6.获取队列头元素

获取头元素就是获取头元素的val

QDataType QueueFront(Queue* qp)
{assert(qp);assert(qp->phead != NULL);return qp->phead->val;}

7.获取队列尾元素

获取尾元素就是获取它的尾的val

QDataType QueueBack(Queue* qp)
{assert(qp);assert(qp->ptail != NULL);return qp->ptail->val;}

8.判断是否为空

判断是否为空只需要返回头和尾节点是否为空

bool QueueEmpty(Queue* qp)//判断空
{assert(qp);return qp->phead == NULL;//qp->size == 0;}

9.有效元素个数

有效元素个数只需要返回他的size就可以了

int QueueSize(Queue* qp)
{assert(qp);return qp->size;
}

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

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

相关文章

数学建模【基于熵权法对TOPSIS模型的修正】

一、修正原因 在前面有关于TOPSIS法和熵权法的介绍&#xff0c;我们可以知道TOPSIS有一个和层次分析法共有的问题&#xff0c;就是各个指标的权重是由我们主观或根据专家的主观评价估计的。层次分析法这个问题还更甚之。而恰好熵权法中的权重是由数据确定的&#xff0c;绝对客…

009-CSS-Less、Scss、Sass

Less、Scss、Sass 概念常用的扩展能力1、嵌套&#xff1a;代码层级清晰2、变量&#xff1a;项目风格抽离3、混合&#xff1a;公共样式封装4、&&#xff1a;当前选择器的父级5、导入&#xff1a;公共文件抽离 在实际工作中&#xff0c;CSS 编写更多的采用 CSS 扩展语言&…

Git 撤销修改

如果我们在我们的工作区写了很长时间代码&#xff0c;发现出现错误&#xff0c;想回退到之前的版本&#xff0c;这时改怎么做呢&#xff1f; 情况一&#xff1a;对于工作区的代码&#xff0c;还没有 add 我们当然也可以使用git diff 查看与上次提交的差异&#xff0c;进行手动删…

【场景题】让你设计一个订单号生成服务,该怎么做?

方案 当设计订单号生成服务时&#xff0c;我们需要考虑唯一性、数据量、可读性、基因法、可扩展性、高性能和高可用性等多个方面。根据这些考虑&#xff0c;一个简单的订单号生成服务设计方案可以采取以下措施&#xff1a; 使用Snowflake算法或第三方分布式ID生成器&#xff…

【力扣经典面试题】58. 最后一个单词的长度

目录 一、问题描述 二、解题思路 三、代码实现&#xff08;C版&#xff09; 四、总结 喜欢可以点赞关注哦&#xff01;谢谢大家哦 一、问题描述 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 …

PackagesNotFoundError:学习利用报错信息找到解决方法

反思&#xff1a;之前看到报错经常是直接复制报错信息去网上搜&#xff0c;但很多情况下报错信息里其实就给出了解决方案 报错信息&#xff1a; Collecting package metadata (current_repodata.json): done Solving environment: unsuccessful initial attempt using frozen …

FRM模型十五:净值归因之Fama_French三因子模型

文章目录 一、起源二、构建因子三、投资组合的净值归因1. 市场因子2. 规模因子3.价值因子4. 基于净值的归因方法 三、代码实现 一、起源 在多因子模型推出之前&#xff0c;CAPM模型被视为资产定价的第一标准。随着市场不断发展&#xff0c;发现了越来越多CAPM模型无法解释的现…

java中的this

在Java中&#xff0c;this 是一个关键字&#xff0c;用于引用当前对象。它可以用于访问当前对象的实例变量和方法。this 关键字通常在以下情况下使用&#xff1a;区分实例变量和局部变量&#xff1a;当实例变量和局部变量名称相同时&#xff0c;可以使用 this 关键字来引用实例…

【linux】crontab定时任务介绍

1.简介2.crontab语法3.crontab限制4.crontab配置文件5.crontab格式介绍 1.简介 Linux crontab 是用来定期执行程序的命令。 当安装完成操作系统之后&#xff0c;默认便会启动此任务调度命令。 crond 命令每分钟会定期检查是否有要执行的工作&#xff0c;如果有要执行的工作便…

u-boot的DM驱动模型

0、本文基于U-Boot 2022.01-v2.07版本进行分析。 1、u-boot编译流程简要分析 2、u-boot启动流程简要分析 3、u-boot增加自定义命令 4、u-boot的DM驱动模型 4.1、参考资料 Uboot中的DM驱动模型&#xff1a;这篇文章详细介绍了DM驱动模型的原理。 本文重点整理了几个数据结构…

超详细的Scrapy框架的基本使用教程

Scrapy的介绍 scrapy的工作流程&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 如下图所示&#xff1a; 爬虫&#xff1a; 负责向引擎提供要爬取网页的URL&#xff0c;引擎会把这个URL封装成request对象并传递给调度器&#xff0c;把引擎传递过来的resp…

常用区块链安全关键名词和攻击方法解释

文章目录 一、重点名词解释1.1 钱包&#xff08;Wallet&#xff09;1.2 冷钱包(Cold Wallet)1.3 热钱包 &#xff08;Hot Wallet&#xff09;1.4 公钥(Public Key)1.5 私钥(Private Key)1.6 助记词(Mnemonic)1.7 Keystore1.8 公链(Public Blockchain)1.9 交易所 Exchange1.10 节…

API 常用的序列化协议详解

目录 JSON (JavaScript Object Notation) XML (Extensible Markup Language) Protocol Buffers (Protobuf) MessagePack Thrift Avro 小结 API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;在软件开发中扮演着至关重要的角色…

leetcode 673.最长递增子序列的个数

上一题只需要知道最长递增子序列的长度就行了&#xff0c;那样的话直接一个dp就完事了&#xff0c;但是呢&#xff0c;这里说了需要记录这个最长长度递增子序列的个数&#xff0c;这下的话&#xff0c;如果你想用原先的思路&#xff0c;其实可以&#xff0c;但是要能做到计数的…

vue3 (六)自定义指令

1.定义自定义指令&#xff1a; app.directive(pos,{mounted(el,bunding){el.style[bunding.arg] bunding.value px;}, updated(el,bunding){el.style[bunding.arg] bunding.value px;} }) app.directive(指令名,{ mounted(el,bunding){}, updated(el,bunding){} }) 如果只…

安卓app软件开发的费用

我们公司总结的开发价格根据安卓APP&#xff0c;苹果APP行业的报价&#xff0c;开发的APP软件费用主要受到两个方面的影响。安卓和苹果APP软件应用的复杂性&#xff0c;第二个是定制开发的APP软件&#xff0c;开发成本和人员的投入成本&#xff0c;以下就是不同的报价费用是怎么…

面试经典150题【51-60】

文章目录 面试经典150题【51-60】71.简化路径155.最小栈150.逆波兰表达式求值224.基本计算器141.环形链表2.两数相加21.合并两个有序链表138.随机链表的复制19.删除链表的倒数第N个节点82.删除链表中的重复元素II 面试经典150题【51-60】 71.简化路径 先用split(“/”)分开。然…

10. Nginx进阶-Return

简介 什么是Return&#xff1f; nginx的return指令是用于在nginx配置文件中进行重定向或返回特定的HTTP响应码的指令。 它可以根据不同的条件来执行不同的操作&#xff0c;如重定向到其他URL、返回指定的HTTP响应码或自定义响应内容等。 Return适用范围 return指令只能在se…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

rabbitmq基础(1)

1、背景 能实现消息队列的框架软件有很多&#xff0c;kafka、rabbitmq、RocketMq、activeMq、Redis&#xff08;非专业&#xff09;&#xff0c;各有各的特点和优缺点。但是之前的公司数据需求规模并非很大&#xff0c;所以采用rabbitmq作为消息队列。 2、rabbitMq的基础架构…