stack
stack的介绍
https://cplusplus.com/reference/stack/stack/?kw=stack
stack是一种容器适配器,专门在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
stack是作为容器适配器被实现的,容器适配器即是对特定类作为其底层的容器,并且提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素特定容器的尾部即栈顶被压入和弹出。
stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
empty:判空操作
back:获取尾部元素操作
push_back:尾部插入元素操作
pop_back:尾部删除元素操作
标准容器vector、deque、list均符合这些需求,默认情况下,如果没有stack指定特定的底层容器,默认情况下使用deque
stack的使用
函数说明 |
接口说明 |
stack() |
构造空的栈 |
empty() |
检测stack是否为空 |
size() |
返回stack中元素的个数 |
top() |
返回栈顶元素的引用 |
push() |
将元素vai踏入stack |
pop() |
将stack中尾部的元素弹出 |
最小栈:
class MinStack
{
public:
void push(int x)
{
// 只要是压栈,先将元素保存到_elem中
_elem.push(x);
// 如果x小于_min中栈顶的元素,将x再压入_min中
if(_min.empty() || x <= _min.top())
_min.push(x);
}
void pop()
{
// 如果_min栈顶的元素等于出栈的元素,_min顶的元素要移除
if(_min.top() == _elem.top())
_min.pop();
_elem.pop();
}
int top(){return _elem.top();}
int getMin(){return _min.top();}
private:
// 保存栈中的元素
std::stack<int> _elem;
// 保存栈的最小值
std::stack<int> _min;
};
栈的弹出压入序列
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
//入栈和出栈的元素个数必须相同
if(pushV.size() != popV.size())
return false;
// 用s来模拟入栈与出栈的过程
int outIdx = 0;
int inIdx = 0;
stack<int> s;
while(outIdx < popV.size())
{
// 如果s是空,或者栈顶元素与出栈的元素不相等,就入栈
while(s.empty() || s.top() != popV[outIdx])
{
if(inIdx < pushV.size())
s.push(pushV[inIdx++]);
else
return false;
}
// 栈顶元素与出栈的元素相等,出栈
s.pop();
outIdx++;
}
return true;
}
};
逆波兰表达式求值
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> s;
for (size_t i = 0; i