news 2026/6/15 16:46:30

STL专项:stack 栈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STL专项:stack 栈

本文章是学习过程中记录的笔记,主要来源Erik_Tse

stack

stack是栈,一种后进先出(Last In First Out)的容器,它仅维护栈顶(top),支持入栈(push),查询栈顶(top),出栈(pop),查询大小(size)操作。

常用于"单调栈","括号匹配","dfs","Tarjan求强连通分量","波兰表达式(计算器)"等算法或数据结构中。

初始化

stack<int> stk;//创建一个空栈,栈不允许列表初始化或填充相同元素

//但是可以从已有的栈进行拷贝构造

stack<int> stk2(stk);

stack<int> stk3 = stk2;

入栈

stk.push(10);//stk = [10(top)]

stk.push(20);//stk = [10,20(top)]

stk.push(50);//stk = [10,20,50(top)]

cout << stk.top() << '\n';//50, stk = [10,20,50(top)]

stk.pop();//stk = [10,20(top)]

cout << stk.top() << '\n';//20, stk = [10,20(top)]

取出栈顶元素

//c++top()只会取出栈顶元素,不会将栈顶元素pop()

cout << stk.top() << '\n';

出栈

//弹出栈顶元素,注意判断非空!

if(stk.size()) {

cout << stk.top() << '\n';

stk.pop();

}

获取栈大小(元素个数),判空

cout << stk.size() << '\n';

if(stk.empty()) ...//栈空

清空栈

while(stk.size()) stk.pop();//O(n)

手写栈

//stack中不允许遍历,但是我们可以用手写栈或者用vector,就可以实现遍历啦

//手写栈,只需要用top表示栈顶下标,以下标1作为栈底即可

int stk[N],top=0;

//入栈

stk[++ top] =x;

//出栈

top --;

//取出栈顶元素

cout << stk[top] << '\n';

//获取大小

cout << top << '\n';

//判断是否为空

if(top) ...//非空

//遍历栈

for(int i=1;i<=top;i++)

//甚至还可以在单调栈上进行二分

练习题(火车)

火车轨道 | 星码StarryCoding 算法竞赛新手村

答案代码

#include<bits/stdc++.h> using namespace std; int main(){ int n;cin>>n; stack<int> stk; int need=1; for(int i=1;i<=n;i++){ int x;cin>>x; stk.push(x); while(stk.size()&&need<=n&&stk.top()==need){ need++; stk.pop(); } } if(need==n+1) cout << "Yes" << '\n'; else cout << "No" << '\n'; return 0; }

注意一点——在 while 循环的条件判断部分,需要先判空,再去取栈顶元素,否则如果为空,但是已经取出栈顶元素了,这是非法操作,不会再进行后续操作(程序崩溃了)

练习题(括号匹配)

括号匹配 | 星码StarryCoding 算法竞赛新手村

答案代码

#include<bits/stdc++.h> using namespace std; const int N = 2e5+9; char s[N]; void solves(){ cin>>s+1; int n=strlen(s+1); stack<char> stk; bool ans=true; for(int i=1;i<=n;i++){ if(s[i]=='('||s[i]=='['||s[i]=='{'){ stk.push(s[i]); }else{ if(stk.empty()){ ans=false; break; }else{ if((stk.top()=='('&&s[i]==')')|| (stk.top()=='['&&s[i]==']')|| (stk.top()=='{'&&s[i]=='}')){ stk.pop(); }else{ ans=false; break; } } } } if(stk.size()) ans=false; cout<<(ans?"YES":"NO")<<'\n'; } int main(){ int _;cin>>_; while(_--){ solves(); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:58:22

YOLO模型如何实现端到端高速检测?技术博客深度剖析

YOLO模型如何实现端到端高速检测&#xff1f;技术博客深度剖析 在智能制造工厂的高速流水线上&#xff0c;每秒有上百个工件经过视觉检测站。系统必须在30毫秒内完成图像采集、缺陷识别与剔除决策——任何延迟都会导致漏检或误判&#xff0c;直接造成经济损失。面对这种“既要快…

作者头像 李华
网站建设 2026/6/15 13:38:52

【花雕学编程】Arduino BLDC 之PID 控制实现精准位置跟踪

Arduino&#xff08;特别是经典的AVR系列如Uno/Nano&#xff09;的硬件资源&#xff08;CPU主频、RAM、Flash、ADC精度、定时器精度、中断响应抖动&#xff09;对于实现高性能的实时PID控制来说&#xff0c;存在显著的硬件瓶颈。因此&#xff0c;“Arduino BLDC PID精准位置跟踪…

作者头像 李华
网站建设 2026/6/14 12:44:47

【python大数据毕设实战】音乐内容智能推荐与市场趋势分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

作者头像 李华
网站建设 2026/6/15 13:31:56

母子定律,准到吓人

妈妈爱干饭&#xff0c;孩子抢饭碗&#xff08;吃饭速度堪比小旋风&#xff09;妈妈爱唠嗑&#xff0c;孩子话不断&#xff08;小嘴叭叭停不下来&#xff09;妈妈爱追剧&#xff0c;孩子当剧迷&#xff08;跟着妈妈哭哭笑笑&#xff09;妈妈爱整洁&#xff0c;孩子瞎忙活&#…

作者头像 李华
网站建设 2026/6/10 1:12:20

YOLO模型缓存穿透防护:布隆过滤器的实际应用

YOLO模型缓存穿透防护&#xff1a;布隆过滤器的实际应用 在智能制造工厂的边缘计算节点上&#xff0c;每天有成千上万的视觉检测设备从私有镜像仓库拉取YOLO模型。某天凌晨&#xff0c;运维团队突然收到告警&#xff1a;中心存储系统负载飙升至95%&#xff0c;大量docker pull…

作者头像 李华