【数据结构】--- 探索栈和队列的奥秘

在这里插入图片描述
关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა
💡个人主页:9ilk
💡专栏:数据结构之旅


上回我们学习了顺序表和链表,今天博主来讲解两个新的数据结构 — 栈和队列 , 请放心食用

文章目录

  • 🏠 栈
    • 📒 何为栈
      • 👿 栈后进先出是相对的
    • 📒 栈的实现
  • 🏠 队列
    • 📒 何为队列
    • 📒 队列的实现

🏠 栈

在这里插入图片描述

对于这么坨书,我们要拿到最下面的书是不是要最后才能拿到;而对于最上面的书它是最晚放上去的却能最先拿到,这样的一个场景就跟我们接下来要介绍的栈类似 — Last in First out(后进先出)

📒 何为栈

在这里插入图片描述

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈数据的插入操作叫做压栈/入栈/进栈,入数据在栈顶。
出栈:栈数据的删除操作叫做出栈,出数据也在栈顶。

👿 栈后进先出是相对的

在这里插入图片描述
由图中我们可知,栈的后进先出是对于同时在栈里的数据而言的

📒 栈的实现

通过前面的分析我们知道,我们需要一个栈顶来表示数据,这跟我们链表的头结点有点相似,但是对于单链表来说实现栈,尾部插入数据并不方便,因此我们选择数组实现栈
在这里插入图片描述

  • 动态栈
typedef int Datatype;
typedef struct Stack
{Datatype* arr;int top;int capacity;
}ST;
  • 栈的初始化与销毁
//初始化
void StackInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}

关于top的初始化:1.top表示栈顶元素的下一个位置时,让top初始化为0,插入数据时先top后++ ;2.top表示栈顶元素 时,top初始化为-1,此时先++后再用top

// 销毁栈 
void StackDestroy(ST* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}
  • 栈的插入数据和删除数据
    这里有了前面顺序表的基础就很简单了,不过要注意压栈和出栈都是在栈顶
//入栈
void StackPush(ST* ps, Datatype data)
{assert(ps);if (ps->capacity == ps->top){//扩容int newcapacity = 0;newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;Datatype* temp = (Datatype*)malloc(newcapacity * sizeof(Datatype));if (temp == NULL){perror("malloc failed");return;}ps->arr = temp;ps->capacity = newcapacity;}//入栈ps->arr[ps->top++] = data;}
//出栈
void StackPop(ST* ps)
{assert(ps);//栈不能为空assert(ps->top != 0);ps->top--;
}
  • 获取栈顶元素
// 获取栈顶元素 
Datatype StackTop(ST* ps)
{assert(ps);//栈不能为空assert(ps->top != 0);return ps->arr[ps->top - 1];
}
  • 判断是否为空
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(ST* ps)
{assert(ps);return ps->top == 0 ? 1 : 0;}
  • 获取栈中有效数据个数
// 获取栈中有效元素个数 
int StackSize(ST* ps)
{assert(ps);return ps->top;
}

🏠 队列

栈是后进先出,那有我们的先进先出(First in First out)吗 ? 当然有,跟现实中我们排队买票一样,这样数据结构叫做队列

📒 何为队列

在这里插入图片描述

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

📒 队列的实现

由于我们是先进先出,出在队头出,进在队尾进,所以我们需要两个“指针”front 和 rear 来标识位置有效率些。

那用数组来实现好还是链表呢?
在这里插入图片描述
用数组的话不好出数据,所以我们这里推荐用链表实现;同时我们可以将front和rear封装进一个结构体这样比较省事

  • 队列结构
typedef int Datatype;
typedef struct QNode
{Datatype data;struct QNode* next;
}QNode;typedef struct Quque
{QNode* head;QNode* tail;int size;
}Quque;

注:我们可以定义一个size表示数据个数,弥补链表需要循环遍历确定数据个数的缺陷

  • 队列的初始化和销毁
//队列的初始化和摧毁
void QuqueInit(Quque* pq)
{assert(pq);pq->size = 0;pq->head = pq->tail = NULL;
}
void QuqueDestroy(Quque* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;}
  • 入队和出队

出队就是链表的头删 入队就是尾插

//队列的入队列和出队列
void QuquePop(Quque* pq)
{assert(pq);assert(pq->head != NULL);//对嘞不能为空//0个结点//1个结点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;}pq->size--;
}
void QuquePush(Quque* pq, Datatype x)
{assert(pq);//申请新结点QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc failed");return;}newnode->data = x;newnode->next = NULL;if (pq->head == NULL){//0个结点pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}
  • 获取头元素和尾元素
//队列的头元素和尾巴元素
Datatype QuqueFront(Quque* pq)
{assert(pq);assert(pq->head != NULL);return pq->head->data;//设置两个指针进结构体的好处
}
Datatype QuqueBack(Quque* pq)
{assert(pq);assert(pq->head != NULL);return pq->tail->data;//设置两个指针进结构体的好处
}
  • 队列是否为空
//队列是否为空
bool QuqueEmpty(Quque* pq)
{assert(pq);if (pq->size == 0){return true;}else{return false;}}
  • 队列有效数据个数
//队列数据个数
int QuqueSize(Quque* pq)
{assert(pq);return pq->size;}

本次分享到这就结束咯,下次我们将讲解链表,栈和队列的OJ题,敬请期待 ~

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

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

相关文章

三足鼎立 PTA(25分)

目录 题目 输入格式: 输出格式: 输入样例: 输出样例: 样例解释: 题解 C code Java code 题目 当三个国家中的任何两国实力之和都大于第三国的时候,这三个国家互相结盟就呈“三足鼎立”之势&#…

【C++】二叉搜索数

目录 一、二叉搜索树的概念 二、二叉搜索树的模拟实现 1、定义节点 2、构造二叉树 3、析构二叉树 ​4、拷贝二叉树 5、二叉树赋值 6、插入节点 🌟【非递归方式】 🌟【递归方式】 7、打印节点 8、搜索节点 🌟【非递归方式】 &…

我的需求分析方法论

或网上看了无数博客文章、技术视频,或购买金装版本技术书籍,看过无数原理原则、各种各样经典方法论,真正在实际开发工作中,本能去遵守和执行的又留下多少呢。 启动一个新系统时,我们可能还会去花些时间遵循这些原理原则…

中文大模型隐私保护哪家强?InternLM 与 Baichuan2 胜出!

引言:中文大模型隐私保护能力探索 本文研究了大语言模型(LLMs)对隐私和安全的影响,采用了三层渐进框架对语言系统的隐私进行评估。主要目标是全面评估LLMs对私人信息的敏感性,并检查其在识别、管理和保护敏感数据方面…

每日面经分享(Git经典题目,Git入门)

1. GitHub是什么 a. Git是一个分布式版本控制系统,作用是跟踪、管理和协调软件开发项目中的代码更改。 b. 提供了一种有效的方式来管理代码的版本历史,以及多人协作开发的能力。 2. Git的作用有哪些 a. 版本控制:Git可以记录每次代码更改的…

混合专家(MoE)模型

文心一言 混合专家模型(Mixture of Experts,简称MoE)是一种基于Transformer架构的模型设计策略。它通过将多个模型(称为“专家”)直接结合在一起,以获得更好的预测性能。这种模型特别适用于处理大规模数据…

1.8 面试经典150题 O(1)时间插入删除和获取随机元素

O(1)时间插入删除和获取随机元素 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。bool remove(int va…

vLLM vs TGI 部署大模型以及注意点

LLM 高并发部署是个难题,具备高吞吐量的服务,能够让用户有更好的体验(比如模型生成文字速度提升,用户排队时间缩短)。 vllm github 仓库 1 vLLM 1.1 启动模型服务 # cd /workspace/vllm python3 -m vllm.entrypoin…

springAI初体验 让人人都能跑大模型

springAI初体验 让人人都能跑大模型 Spring AI是一个旨在简化开发包含人工智能功能的应用程序的项目。它受到Python项目如LangChain和Llama Index的启发,但并非这些项目的直接移植。Spring AI的核心理念是为开发AI应用程序提供基础抽象,这些抽象有多个实…

leetcode496-Next Greater Element I

题目&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 < i < nums1.lengt…

MyBatis中的#{}与${}注入问题

MyBatis中的#{}与${}注入问题 MyBatis是一个流行的Java持久层框架,用于将对象与数据库中的数据进行映射。然而,如果不当使用,MyBatis也可能受到诸如SQL注入这类的安全问题的影响。 SQL注入是一种攻击技术,攻击者通过在输入中插入恶意SQL语句片段,企图对数据库执行非预期的…

Everything搭建http服务器

突然发现everything还可以搭建http服务器&#xff0c;给大家分享一下 打开everything&#xff0c;按图示填写或选择内容 在浏览器输入你的本地地址和端口 再输入刚才设置的账户密码&#xff0c;即可使用

接口测试常用代理工具

些代理工具可以帮助我们构造各种测试场景、以及更好的完成测试工作。下面的介绍以 Charles 为主。 Charles Charles 是一款代理服务器&#xff0c;可以截取请求和响应达到分析抓包的目的&#xff0c;且支持多平台&#xff0c;能够在 Windows&#xff0c;Mac&#xff0c;Linux…

【OJ】动规练习七之【模板】01背包

个人主页 &#xff1a; zxctscl 如有转载请先通知 DP41 【模板】01背包 1. DP41 【模板】01背包2. 分析3. 代码4. 优化5. 优化后代码 1. DP41 【模板】01背包 2. 分析 一、题目解析&#xff1a; 来看一下例1&#xff0c;3代表有三个物品&#xff0c;5代表能够容纳的体积。第一…

1970-2021年全国区县级碳排放数据8

1970-2021年全国区县级碳排放数据 1、时间&#xff1a;1970-2021年 2、指标&#xff1a;2877个区县 3、来源&#xff1a;EDGAR 4、指标&#xff1a;二氧化碳排放量 5、样本量&#xff1a;14W 6、指标解释&#xff1a; 二氧化碳排放是一个生态环境专业术语&#xff0c;主…

【Python系列】读取 Excel 第一列数据并赋值到指定列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PyCharm远程链接AutoDL

AutoDL使用方法&#xff1a; Step1&#xff1a;确认您安装的PyCharm是社区版还是专业版&#xff0c;只有专业版才支持远程开发功能。 Step2&#xff1a;开机实例 复制自己实例的SSH指令&#xff0c;比如&#xff1a;ssh -p 38076 rootregion-1.autodl.com 在ssh -p 38076 roo…

二、计算机网络体系结构参考模型

一、分层结构 &#xff08;一&#xff09;为什么要分层&#xff1a; 发送文件/数据前要完成的工作&#xff1a; 1&#xff09;发起通信的计算机必须讲数据通信通路进行激活 2&#xff09;要告诉网络如何识别目的主机 3&#xff09;发起通信的计算机要查明目的主机是否开机、并且…

先登杯·14天创作挑战营·第④期~ 等你来战!

文章目录 ⭐️ 活动介绍⭐️ 活动详情⭐️ 活动奖品⭐️ 活动流程​⭐️ 评审规则⭐️ 报名&投稿注意事项⭐️ 活动组织 ​ 活动报名入口&#xff1a;https://bbs.csdn.net/topics/618374514 本次活动与官方活动及其他博主的创作型活动并不冲突&#xff01; ​ ​ ⭐️…

android studio中添加module依赖

android常用的三种依赖 库依赖&#xff08;Library dependency&#xff09;&#xff1a;以访问网址的形式将依赖库相应版本下载到本地; 文件依赖&#xff08;File dependency&#xff09;&#xff1a; 将下载下来的依赖库以.jar文件的形式添加依赖. module依赖&#xff08;Modu…