前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[C++STL教程]3.stack栈入门简明教程,小白都能理解~

[C++STL教程]3.stack栈入门简明教程,小白都能理解~

原创
作者头像
Eriktse
发布2023-03-16 20:46:55
2770
发布2023-03-16 20:46:55
举报
文章被收录于专栏:编程技巧编程技巧

在学习之前,先了解一下什么是stack

std::stack 类是容器适配器,它给予程序员栈的功能——特别是 FILO (先进后出)数据结构。

该类模板表现为底层容器的包装器——只提供特定函数集合。栈从被称作栈顶的容器尾部推弹元素。

FILO指的是First In Last Out,也就是说第一个进来的,是最后一个出去的。我们可以将stack理解为一个上端开口的铁箱子,我们可以从顶部拿出物品或放入物品,且记录物品个数。

stack仅维护一个栈顶,意味着我们只能从一端对数据进行操作。

本文仅从入门和实用角度介绍queue的用法,主要针对初学者或竞赛向。如有不严谨的地方欢迎指正!

初始化

在使用stack之前,需要先引入头文件。

代码语言:c++
复制
#include <stack>

初始化的语法如下:

代码语言:c++
复制
stack<T> stk;// T 为数据类型

stack<int> stk_int;//声明一个栈,存放类型为int

和其他的stl容器一样,stack只能存放相同类型的元素,默认初始化为空栈。

入栈

stk.push(x)将元素x推入栈stk的栈顶,复杂度O(1)

每入栈一个新元素,会使得栈的大小+1。

代码语言:c++
复制
// 左边为栈顶
// stk: empty

stk.push(1);
// stk : 1

stk.push(5);
// stk : 5 1

还有一种方法是用emplace()函数进行入栈,两者差别可以暂时忽略。

代码语言:c++
复制
stk.emplace(7);
// stk : 7 5 1

出栈

stk.pop()stk的栈顶元素弹出栈,复杂度O(1)

代码语言:c++
复制
// stk : 7 5 1

stk.pop();
// stk : 5 1

stk.pop();

// stk : 1

在出栈时要注意栈是否为空,空栈不允许出栈。这和queue出队类似,感兴趣的可以看看这篇文章:https://www.eriktse.com/technology/1063.html

你问一个人“push”的反义词是什么?如果他回答“pop”那他一定是程序员。(答案也许是“pull”)

获取栈顶元素

语法:stk.top()可以获取栈顶元素,但是不会自动将栈顶元素弹出。需要自行pop()。复杂度O(1)

代码语言:c++
复制
// stk : 7 5 1

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

注意获取栈顶元素的时候也需要保证栈不为空,否则将导致错误!

获取栈的大小

语法:stk.size(),返回值为一个非负整数,当返回0时表示栈为空,复杂度O(1)

代码语言:c++
复制
// stk : 1
cout << stk.size() << '\n';// 1

stk.push(9);
// stk : 9 1
cout << stk.size() << '\n';// 2

本文由eriktse原创,未经允许禁止转载!

判断栈是否为空

语法:stk.empty(),返回值为一个bool值,当返回true时表示栈为空,当返回值为false时表示栈非空。复杂度O(1)

代码语言:c++
复制
// stk : 9 1
cout << st.empty() << '\n';// false
stk.pop(), stk.pop();
// stk : empty
cout << st.empty() << '\n';// true

当然你也可以用stk.size() == 0来判断栈是否为空。

清空栈

和清空queue类似,stack没有clear()函数,但是可以通过多种办法来实现。

代码语言:c++
复制
//方法一:只要栈不为空就一直弹出,直到为空
while(!stk.empty())stk.pop();

//方法二:直接赋值一个新的stack,默认为空栈
stk = stack<int>();

交换栈

语法:stk1.swap(stk2),返回值为void(),复杂度O(1)

代码语言:c++
复制
stack<int> s, t;
s.emplace(1);
t.emplace(2);
cout << s.top() << '\n';// 1
s.swap(t);
cout << s.top() << '\n';// 2

常用函数总结

  • push(x)将元素x入栈
  • emplace(x)在栈顶构造元素x,并入栈(可以简单理解push()和emplace()差别不大)
  • pop()无参数,将栈顶元素弹出
  • size()返回栈的大小(元素个数)
  • empty()返回bool值表示栈是否为空
  • stk1.swap(stk2)交换两个栈

补充知识

栈在处理一些问题的时候非常好用,比如在做深度优先搜索dfs的时候,需要需要用到栈的思想,其中节点的遍历顺序可以用栈顺序表示。

同时利用栈可以构造一些特殊的数据结构比如单调栈从而求出一些特殊的东西,比如最大上升/下降子序列,从而优化一些dp问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初始化
  • 入栈
  • 出栈
  • 获取栈顶元素
  • 获取栈的大小
  • 判断栈是否为空
  • 清空栈
  • 交换栈
  • 常用函数总结
  • 补充知识
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档