news 2026/6/23 21:02:35

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/22 11:45:33

YOLO在光污染监测的应用:夜间灯光强度视觉评估

YOLO在光污染监测的应用&#xff1a;夜间灯光强度视觉评估 城市夜晚的灯火辉煌&#xff0c;曾是现代化的象征。然而&#xff0c;当霓虹永不熄灭、路灯彻夜通明&#xff0c;这份“光明”正悄然演变为一种隐形的环境负担——光污染。它不仅遮蔽了星空&#xff0c;扰乱动植物节律&…

作者头像 李华
网站建设 2026/6/6 19:15:10

YOLO模型灰度发布后的性能回归测试

YOLO模型灰度发布后的性能回归测试 在智能制造工厂的视觉质检线上&#xff0c;一台搭载YOLOv8的边缘设备正以每秒60帧的速度检测电路板上的元器件缺陷。某天&#xff0c;运维团队收到告警&#xff1a;系统整体延迟上升了15%&#xff0c;部分工位出现漏检。排查发现&#xff0c;…

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

构建LLM支持的AI Agent创新思维系统

构建LLM支持的AI Agent创新思维系统 关键词:LLM(大语言模型)、AI Agent、创新思维系统、智能交互、认知推理 摘要:本文聚焦于构建基于大语言模型(LLM)支持的AI Agent创新思维系统。详细介绍了相关背景知识,包括目的、预期读者、文档结构等。深入剖析了核心概念,阐述了L…

作者头像 李华
网站建设 2026/6/2 2:53:14

YOLO在空气质量监测的应用:扬尘颗粒物视觉识别

YOLO在空气质量监测的应用&#xff1a;扬尘颗粒物视觉识别 城市工地的塔吊下&#xff0c;尘土随风翻卷&#xff0c;一辆渣土车正缓缓驶出围挡——如果没有盖篷布&#xff0c;这可能就是一次典型的扬尘污染事件。过去&#xff0c;这类行为往往要等到空气检测站读数异常、市民投诉…

作者头像 李华
网站建设 2026/6/16 13:57:46

YOLO在智能楼宇的应用:电梯内人数统计与超载预警

YOLO在智能楼宇的应用&#xff1a;电梯内人数统计与超载预警 在高层建筑林立的今天&#xff0c;电梯早已不是简单的垂直运输工具——它成了衡量楼宇智能化水平的一扇窗口。然而&#xff0c;大多数电梯仍停留在“称重报警”的初级安全阶段。你是否经历过这样的尴尬&#xff1a;几…

作者头像 李华