在学习之前,先理解一下什么是stack
。
std::stack 类是容器适配器,它给予程序员栈的性能——特地是 FILO (先进后出)数据结构。
该类模板体现为底层容器的包装器——只提供特定函数汇合。栈从被称作栈顶的容器尾部推弹元素。
FILO
指的是First In Last Out
,也就是说第一个进来的,是最初一个进来的。咱们能够将stack
了解为一个上端闭口的铁箱子,咱们能够从顶部拿出物品或放入物品,且记录物品个数。
stack
仅保护一个栈顶,意味着咱们只能从一端对数据进行操作。
本文仅从入门和实用角度介绍queue的用法,次要针对初学者或比赛向。如有不谨严的中央欢送斧正!
初始化
在应用stack
之前,须要先引入头文件。
#include <stack>
初始化的语法如下:
stack<T> stk;// T 为数据类型stack<int> stk_int;//申明一个栈,寄存类型为int
和其余的stl容器一样,stack
只能寄存雷同类型的元素,默认初始化为空栈。
入栈
stk.push(x)
将元素x
推入栈stk
的栈顶,复杂度O(1)
。
每入栈一个新元素,会使得栈的大小+1。
// 右边为栈顶// stk: emptystk.push(1);// stk : 1stk.push(5);// stk : 5 1
还有一种办法是用emplace()
函数进行入栈,两者差异能够临时疏忽。
stk.emplace(7);// stk : 7 5 1
出栈
stk.pop()
将stk
的栈顶元素弹出栈,复杂度O(1)
。
// stk : 7 5 1stk.pop();// stk : 5 1stk.pop();// stk : 1
在出栈时要留神栈是否为空,空栈不容许出栈。这和queue
出队相似,感兴趣的能够看看这篇文章:https://www.eriktse.com/technology/1063.html
你问一个人“push”的反义词是什么?如果他答复“pop”那他肯定是程序员。(答案兴许是“pull”)
获取栈顶元素
语法:stk.top()
能够获取栈顶元素,然而不会主动将栈顶元素弹出。须要自行pop()
。复杂度O(1)
。
// stk : 7 5 1cout << stk.top() << '\n';// 7
留神获取栈顶元素的时候也须要保障栈不为空,否则将导致谬误!
获取栈的大小
语法:stk.size()
,返回值为一个非负整数,当返回0
时示意栈为空,复杂度O(1)
。
// stk : 1cout << stk.size() << '\n';// 1stk.push(9);// stk : 9 1cout << stk.size() << '\n';// 2
本文由eriktse原创,未经容许禁止转载!
判断栈是否为空
语法:stk.empty()
,返回值为一个bool
值,当返回true
时示意栈为空,当返回值为false
时示意栈非空。复杂度O(1)
。
// stk : 9 1cout << st.empty() << '\n';// falsestk.pop(), stk.pop();// stk : emptycout << st.empty() << '\n';// true
当然你也能够用stk.size() == 0
来判断栈是否为空。
清空栈
和清空queue
相似,stack
没有clear()
函数,然而能够通过多种方法来实现。
//办法一:只有栈不为空就始终弹出,直到为空while(!stk.empty())stk.pop();//办法二:间接赋值一个新的stack,默认为空栈stk = stack<int>();
替换栈
语法:stk1.swap(stk2)
,返回值为void()
,复杂度O(1)
。
stack<int> s, t;s.emplace(1);t.emplace(2);cout << s.top() << '\n';// 1s.swap(t);cout << s.top() << '\n';// 2
罕用函数总结
push(x)
将元素x入栈emplace(x)
在栈顶结构元素x,并入栈(能够简略了解push()和emplace()差异不大)pop()
无参数,将栈顶元素弹出size()
返回栈的大小(元素个数)empty()
返回bool值示意栈是否为空stk1.swap(stk2)
替换两个栈
补充常识
栈在解决一些问题的时候十分好用,比方在做深度优先搜寻dfs
的时候,须要须要用到栈的思维,其中节点的遍历程序能够用栈程序示意。
同时利用栈能够结构一些非凡的数据结构比方枯燥栈
从而求出一些非凡的货色,比方最大回升/降落子序列
,从而优化一些dp
问题。