栈&队列

基本概念

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

基本函数

头文件stack
定义stack<数据类型>栈名,如stack<int>t
操作t.push(x),将x放入t的栈顶,t.pop(),弹出t的栈顶的元素;
访问t.top()t的栈顶元素,t.empty()t是否为空,t.size(),栈t的元素数量;
运算符t1=t2t2赋值给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=q2q2赋值给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=q2q2赋值给q1`。

习题

P1419
P1886
P1901
P5788
P1165
P1540
P1739
P1981

posted @ 2023-10-08 08:29  xyh0528  阅读(17)  评论(0)    收藏  举报