1.栈的定义
我们可以看到模板参数里面有一个容器适配器 ,什么是适配器?比如充电器就叫做电源适配器,用在做转换,对电压进行相关的转换适配我们的设备。栈,队列不是自己直接管理数据,是让其他容器管理数据,在其他容器上去封装转换我想要的东西。
和容器 vector,list相比,他们是直接自己管理数据,但是栈不是
2.接口
2.1 stack
核心的接口是empty,size,top,push,pop
2.2 queue
核心的接口是empty,size,front,push,pop
3.使用
3.1 stack
void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;
}
3.2 queue
void test_queue()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;
}
4. 应用
4.1 最小栈
利用双栈的思路,以空间换时间,<=都更新
class MinStack {
public:MinStack() {}void push(int val) {_st.push(val);if(_minst.empty()||val<=_minst.top()){_minst.push(val);}}void pop() {if(_st.top()==_minst.top()){_minst.pop();}_st.pop();}int top() {return _st.top();}int getMin() {return _minst.top();}stack<int> _st;stack<int> _minst;
};
但是要是st中是大量重复的数据,应该怎么办呢?
按照上面的代码,minst必须全部进
minst中不要存数据,存个数 (5,1)(3,1)stack<countVal>_minst
struct countVal
{
int _val;
int _count=0;
}
4.2 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
思路:模拟出栈入栈顺序
步骤1:入栈序列先入栈,结束条件:入栈序列走到尾就结束!
匹配:栈为空
不匹配:栈不为空
步骤2:栈顶数据和出栈序列比较
a.如果匹配,出栈序列++,出栈顶元素,继续比较,直到栈为空或者不匹配
b.如果不匹配,入栈序列先入栈
class Solution {
public:bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {stack<int> st;size_t pushi=0,popi=0;while(pushi<pushV.size()){st.push(pushV[pushi++]);while(!st.empty()&&st.top()==popV[popi]){st.pop();popi++;}}return st.empty();}
};