⭐一、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); //向堆栈中压入元素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
⭐四、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); //向堆栈中压入元素2 s.push(3); //向堆栈中压入元素3 s.push(4); //向堆栈中压入元素4 while(!s.empty()) { cout<<s.top()<<" "; s.pop(); } }
⭐五、stack的真题巩固
下面是PTA中团体程序设计天梯赛-练习集的一道L2二阶题目,对于刚学习完本文stack内容的小伙伴来讲做起来可能有点困难哈,但如果你会做了的话那你对于stack的掌握会是比较熟悉的一个状态!
下方为题目链接
堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下:
首先准备两根柱子,一根 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本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️
💕 回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。