C++中stack的用法(超详细,入门必看)

news/2024/11/25 15:22:03/

博主简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。
博主主页:@陈童学哦
所属专栏:C++STL

在这里插入图片描述

前言:Hello各位小伙伴们好!欢迎来到本专栏C++STL的学习,本专栏旨在帮助大家了解并熟悉使用C++中的STL,C++中的STL(标准模板库)是相当好用的,🍉🍉🍉所以大家赶紧订阅一起学起来叭!那么话不多说接下来就进入本文C++中stack的学习。

📢📢📢站点

  • ⭐一、stack的简介
  • ⭐二、stack的定义及初始化
  • ⭐三、stack中常用的成员函数
  • ⭐四、stack的遍历方法
  • ⭐五、stack的真题巩固
  • ⭐六、写在最后

⭐一、stack的简介

stack的中文译为堆栈堆栈一种数据结构。C语言中堆栈的定义及初始化以及一些相关操作实现起来较为繁琐,而C++的stack让这些都变得简便易实现。因为C++中有许多关于stack的方法函数。
堆栈(stack)最大的特点就是先进后出(后进先出)。就是说先放入stack容器的元素一定要先等比它后进入的元素出去后它才能出去。呃这样说可能有点绕哈哈,举个生活中的例子吧。

某一天,天气炎热,你买了一个冰淇淋甜筒,而这个冰淇淋甜筒在制作过程时冰淇淋是不是先进入到甜筒的底部然后到最上面呢,但是你在吃的过程中要从最上面吃起到最后才能吃到甜筒底部的冰淇淋,但底部的冰淇淋是先进入甜筒的对吧。这就是所谓的先进后出啦!

使用stack时需要包含头文件:

#include<stack>

⭐二、stack的定义及初始化

  • 定义
    stack<数据类型> 容器名
    例:
//stack的定义 
stack<int>s1; //定义一个储存数据类型为int的stack容器s1 
stack<double>s2; //定义一个储存数据类型为double的stack容器s2
stack<string>s3; //定义一个储存数据类型为string的stack容器s3
stack<结构体类型>s4; //定义一个储存数据类型为结构体类型的stack容器s4
stack<int> s5[N]; //定义一个储存数据类型为int的stack容器数组,N为大小 
stack<int> s6[N]; //定义一个储存数据类型为int的stack容器数组,N为大小 

⭐三、stack中常用的成员函数

关于stack的常用函数:

empty() //判断堆栈是否为空
pop() //弹出堆栈顶部的元素
push() //向堆栈顶部添加元素
size() //返回堆栈中元素的个数
top() //返回堆栈顶部的元素 

示例代码:

#include<iostream>
#include<stack>
using namespace std;
int main()
{stack<int> s; //定义一个数据类型为int的stack s.push(1); //向堆栈中压入元素1 s.push(2); //向堆栈中压入元素2s.push(3); //向堆栈中压入元素3s.push(4); //向堆栈中压入元素4cout<<"将元素1、2、3、4一一压入堆栈中后,堆栈中现在的元素为:1、2、3、4"<<endl;cout<<"堆栈中的元素个数为:"<<s.size()<<endl;//判断堆栈是否为空 if(s.empty()){cout<<"堆栈为空"<<endl;}else{cout<<"堆栈不为空"<<endl;}cout<<"堆栈的最顶部元素为:"<<s.top()<<endl;//弹出堆栈最顶部的那个元素 s.pop();cout<<"将堆栈最顶部元素弹出后,现在堆栈中的元素为1、2、3"<<endl;}

运行结果:

将元素1234一一压入堆栈中后,堆栈中现在的元素为:1234
堆栈中的元素个数为:4
堆栈不为空
堆栈的最顶部元素为:4
将堆栈最顶部元素弹出后,现在堆栈中的元素为123

⭐四、stack的遍历方法

堆栈中的数据是不允许随机访问的,也就是说不能通过下标访问,且堆栈内的元素是无法遍历的。

我们可以通过while循环的方法将stack中的元素读取一遍,但是这种方法非常局限,因为我们每读取一个元素就需要弹出这个元素,因此该方法只能读取一遍stack中的元素。

例:

#include<iostream>
#include<stack>
using namespace std;
int main()
{stack<int> s; //定义一个数据类型为int的stack s.push(1); //向堆栈中压入元素1 s.push(2); //向堆栈中压入元素2s.push(3); //向堆栈中压入元素3s.push(4); //向堆栈中压入元素4while(!s.empty()){cout<<s.top()<<" ";s.pop();}	
}

⭐五、stack的真题巩固

下面是PTA中团体程序设计天梯赛-练习集的一道L2二阶题目,对于刚学习完本文stack内容的小伙伴来讲做起来可能有点困难哈,但如果你会做了的话那你对于stack的掌握会是比较熟悉的一个状态!

下方为题目链接!!!!!!!!

--------------------L2-045 堆宝塔--------------------
题目详情:
在这里插入图片描述
堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下:

  • 首先准备两根柱子,一根 A 柱串宝塔,一根 B 柱用于临时叠放。
  • 把第 1 块彩虹圈作为第 1 座宝塔的基座,在 A 柱放好。
  • 将抓到的下一块彩虹圈 C 跟当前 A 柱宝塔最上面的彩虹圈比一下,如果比最上面的小,就直接放上去;否则把 C 跟 B 柱最上面的彩虹圈比一下:
  • 如果 B 柱是空的、或者 C 大,就在 B 柱上放好;
  • 否则把 A 柱上串好的宝塔取下来作为一件成品;然后把 B 柱上所有比 C 大的彩虹圈逐一取下放到 A 柱上,最后把 C 也放到 A 柱上。
    重复此步骤,直到所有的彩虹圈都被抓完。最后 A 柱上剩下的宝塔作为一件成品,B 柱上剩下的彩虹圈被逐一取下,堆成另一座宝塔。问:宝宝一共堆出了几个宝塔?最高的宝塔有多少层?

输入格式:
输入第一行给出一个正整数 N(≤10
3
),为彩虹圈的个数。第二行按照宝宝抓取的顺序给出 N 个不超过 100 的正整数,对应每个彩虹圈的直径。

输出格式:
在一行中输出宝宝堆出的宝塔个数,和最高的宝塔的层数。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:
11
10 8 9 5 12 11 4 3 1 9 15
输出样例:
4 5
样例解释:
宝宝堆成的宝塔顺次为:

  • 10、8、5
  • 12、11、4、3、1
  • 9
  • 15、9

AC代码:

#include<bits/stdc++.h>
using namespace std;
int max(int a,int b)
{return a>b?a:b;
}
int main()
{int n;cin>>n;stack<int>A,B;int count=0;int max1=0;while(n--){int C;cin>>C;if(A.empty()||C<A.top())A.push(C);else{if(B.empty()||C>B.top())B.push(C);else{max1=max(max1,A.size());while(A.size())A.pop();count++;while(!B.empty()&&B.top()>C){A.push(B.top());B.pop();}A.push(C);}}}if(!A.empty()){max1=max(max1,A.size());count++;while(!A.empty()){A.pop();}}if(!B.empty()){max1=max(max1,B.size());count++;while(!B.empty()){B.pop();}}cout<<count<<" "<<max1;
}

⭐六、写在最后

OK本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️

💕 回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。

🍁🍁🍁那么我们下期再见!拜拜ヾ(•ω•`)o
在这里插入图片描述


http://www.ppmy.cn/news/85445.html

相关文章

1.java高级之文件和Io流

1.什么是流 java程序到系统文件的通道(以java程序为参照物)java<--input--文件-output-->如果以文件为参照物java--input-->文件<--output--2.File类 文件/目录 //定义文件夹 File pathnew File("E:\\data"); \\(用于文件夹) 要区分于\,\是通常用在\n \…

安科瑞电力监控系统和五防系统在锡林郭勒项目的应用

摘要&#xff1a;随着电力、计算机、信息和网络等技术的不断发展&#xff0c;推动了电力监控的快速发展&#xff0c;人们对电力系统运行的安全性以及稳定性的要求越来越高。本文针对锡林郭勒供配电系统特点及供配电系统高可靠性的要求&#xff0c;提出了保护类、监测类和防误闭…

多线程-Thread类的常用方法和生命周期

Thread类的常用结构 构造器 public Thread():分配一个新的线程对象。public Thread(String name):分配一个指定名字的新的线程对象。public Thread(Runnable target):指定创建线程的目标对象&#xff0c;它实现了Runnable接口中的run()方法。public Thread(Runnable target,S…

Java调用第三方库JNA(C/C++)

GitHub - java-native-access/jna: Java Native Access 源代码 在Java 中使用C语言库的传统做法是使用JNI编程。但是现在有更好的替代方案&#xff0c;即JNA(Java Native Access)&#xff1b;JNA是一个开源的Java框架,是SUN公司推出的调用本地库方法的技术&#xff0c;是建立在…

【计算机网络基础】辨析专题⑥ 应用层

文章目录 重要简写重要概念重要简写 域名系统——DNS文件传送协议——FTP简单文件传送协议——TFTP远程终端协议——TELNET万维网——WWW统一资源定位符——URL超文本传送协议——HTTP超文本标记语言——HTML可扩展标记语言——XML可扩展超文本标记语言——XHTML层叠样式表——…

图结构-图的数据表示法(java)

图结构 常见的图的数据表示法自定义一种数据结构来表示图。将一个线段集合转成我们自定义的图 常见的图的数据表示法 1.邻接矩阵表示法&#xff1a;用二维数组存储图的信息&#xff0c;数组中的对角线为0&#xff0c;表示不存在顶点到自身的边。若两个顶点之间有一条弧&#xf…

10款提效的在线设计工具推荐

在效率为王的时代&#xff0c;在线设计是设计的未来&#xff0c;为设计师提供了更节省时间、精力和成本的解决方案。 在线设计工具可以通过打开浏览器使用&#xff0c;大多数操作界面比传统设计工具更简单&#xff0c;入门门槛很低。 在这篇文章中&#xff0c;我们精心挑选了…

微信小程序的生命周期

微信小程序的生命周期 1.什么是生命周期&#xff1f;2.生命周期的分类3.什么是生命周期函数&#xff1f;4.生命周期函数的分类5.应用生命周期函数6.页面周期函数7.组件的生命周期函数lifetimes节点 8.组件所在页面的生命周期①什么是组件所在页面的生命周期&#xff1f;②pageL…