博主简介:
Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。
博主主页:@陈童学哦
所属专栏:C++STL
前言:
Hello各位小伙伴们好!欢迎来到本专栏C++STL的学习,本专栏旨在帮助大家了解并熟悉使用C++中的STL,C++中的STL(标准模板库)是相当好用的,所以大家赶紧订阅一起学起来叭!那么话不多说接下来就进入本文C++中stack的学习。
stack的中文译为堆栈
,堆栈
一种数据结构。C语言中堆栈的定义及初始化以及一些相关操作实现起来较为繁琐,而C++的stack让这些都变得简便易实现。因为C++中有许多关于stack的方法函数。
堆栈(stack)最大的特点就是先进后出(后进先出)。就是说先放入stack容器的元素一定要先等比它后进入的元素出去后它才能出去。呃这样说可能有点绕哈哈,举个生活中的例子吧。
某一天,天气炎热,你买了一个冰淇淋甜筒,而这个冰淇淋甜筒在制作过程时冰淇淋是不是先进入到甜筒的底部然后到最上面呢,但是你在吃的过程中要从最上面吃起到最后才能吃到甜筒底部的冰淇淋,但底部的冰淇淋是先进入甜筒的对吧。这就是所谓的先进后出啦!
使用stack时需要包含头文件:
#include
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的常用函数:
empty() //判断堆栈是否为空
pop() //弹出堆栈顶部的元素
push() //向堆栈顶部添加元素
size() //返回堆栈中元素的个数
top() //返回堆栈顶部的元素
示例代码:
#include
#include
using namespace std;
int main()
{
stack<int> s; //定义一个数据类型为int的stack
s.push(1); //向堆栈中压入元素1
s.push(2); //向堆栈中压入元素2
s.push(3); //向堆栈中压入元素3
s.push(4); //向堆栈中压入元素4
cout<<"将元素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;
}
运行结果:
将元素1、2、3、4一一压入堆栈中后,堆栈中现在的元素为:1、2、3、4
堆栈中的元素个数为:4
堆栈不为空
堆栈的最顶部元素为:4
将堆栈最顶部元素弹出后,现在堆栈中的元素为1、2、3
堆栈中的数据是不允许随机访问的,也就是说不能通过下标访问,且堆栈内的元素是无法遍历的。
我们可以通过while循环的方法将stack中的元素读取一遍,但是这种方法非常局限,因为我们每读取一个元素就需要弹出这个元素,因此该方法只能读取一遍stack中的元素。
例:
#include
#include
using namespace std;
int main()
{
stack<int> s; //定义一个数据类型为int的stack
s.push(1); //向堆栈中压入元素1
s.push(2); //向堆栈中压入元素2
s.push(3); //向堆栈中压入元素3
s.push(4); //向堆栈中压入元素4
while(!s.empty())
{
cout<<s.top()<<" ";
s.pop();
}
}
下面是PTA中团体程序设计天梯赛-练习集的一道L2二阶题目,对于刚学习完本文stack内容的小伙伴来讲做起来可能有点困难哈,但如果你会做了的话那你对于stack的掌握会是比较熟悉的一个状态!
下方为题目链接!!!!!!!!
--------------------L2-045 堆宝塔--------------------
题目详情:
堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下:
输入格式:
输入第一行给出一个正整数 N(≤10
3
),为彩虹圈的个数。第二行按照宝宝抓取的顺序给出 N 个不超过 100 的正整数,对应每个彩虹圈的直径。
输出格式:
在一行中输出宝宝堆出的宝塔个数,和最高的宝塔的层数。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
11
10 8 9 5 12 11 4 3 1 9 15
输出样例:
4 5
样例解释:
宝宝堆成的宝塔顺次为:
AC代码:
#include
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本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️
回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。