栈&队列
栈
基本概念
栈,主打一个先进后出,栈有两端,栈底和栈顶,栈顶可以修改,栈底不行,新入栈的会把之前的压入栈底,如下图。

基本函数
头文件stack;
定义stack<数据类型>栈名,如stack<int>t;
操作t.push(x),将x放入t的栈顶,t.pop(),弹出t的栈顶的元素;
访问t.top(),t的栈顶元素,t.empty()栈t是否为空,t.size(),栈t的元素数量;
运算符t1=t2将t2赋值给t1。
单调栈
实际就是通过pop维护栈内元素的单调性。
例如:我们需要将一些元素入栈,但如果push后栈内元素不是从小到大的,就在push前一直pop,直到push后从小到大。
下给出代码示范
int a[N],n;
cin>>n;
stack<int>t;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
while(!t.empty()&&t.top()>a[i])t.pop();//一定要先判断栈是否为空,不然会先返回top,导致RE
t.push(a[i]);
}
队列
基本概念
所谓队列,主打一个先进先出,队列有两端,队头队尾,新元素加入队尾,旧元素弹出队头,如下图。

基本函数
头文件queue;
定义queue<数据类型>队列,如queue<int>q;
操作q.push(x),将x放入q的队尾,q.pop(),弹出q的队头的元素;
访问q.front(),q队头元素,q.back(),q队尾元素,q.empty()队列q是否为空,q.size(),队列q的元素数量;
运算符q1=q2将q2赋值给q1。
双端队列
所谓双端队列,就是他可以在既可以在队头进行入队和出队操作,又可以在队尾进行队尾入队出队操作。
头文件deque;
拥有与普通队列相同的访问操作、定义、运算符,同时添加了新的插入弹出函数和新的访问运算符;
q.push_back(x)在队尾放入元素,q.pop_back(),在队尾弹出元素,q.push_front(x),在队头插入元素,q.pop_front()在队头弹出元素。
运算符[]访问 ,与vector,数组类似。
单调队列
与单调栈类似,同样是维护队列的单调性。
单调队列用普通队列和双端队列都可以维护,视情况选择,如果队尾的元素满足某一种条件,一直弹出队尾元素,直到无法满足,此类问题在求连续区间最值问题很常见,不再赘述(多刷题总会遇见)。
优先队列
头文件queue;
定义priority_queue<数据类型>队列,如priority_queue<int>q;
操作q.push(x),将x放入q的队尾,q.pop(),弹出q的队头的元素(注\(O(\log n)的复杂度\));
访问q.top(),q队头元素,q.empty()队列q是否为空,q.size(),队列q的元素数量; 运算符q1=q2将q2赋值给q1`。

浙公网安备 33010602011771号