一、栈
1.栈的特点
栈是一种线性结构的,单端开口的容器适配器,支持数组和链表作为底层数据结构,特点是后进先出。
2.栈的基本使用
头文件:#include<stack>
基本构造函数:stack<int>i_sta
基本的接口函数:
s.empty(); //如果栈为空则返回true, 否则返回false;
s.size(); //返回栈中元素的个数
s.top(); //返回栈顶元素, 但不删除该元素
s.pop(); //弹出栈顶元素, 但不返回其值s.push(); //将元素压入栈顶
2.1实现返回栈中最大值的操作
#include<stack>
class myque
{
public:
stack<int>i_sta;
stack<int>o_sta;
void push(int x)
{
i_sta.push(x);
if (o_sta.empty())
{
o_sta.push(x);
}
else
{
if (x > o_sta.top())
{
o_sta.push(x);
}
}
}
void pop()
{
if (i_sta.top() == o_sta.top())o_sta.pop();
i_sta.pop();
}
int min()
{
return o_sta.top();
}
};
int main()
{
myque que;
que.push(3);
que.push(1);
que.push(5);
que.push(2);
que.push(7);
cout << que.min();
que.pop();
cout << que.min();
}
2.2单调栈的实现
二、队列
1.队列的特点
队列也是一种容器适配器,双端开口,队尾进队首出,特点是先进先出
2.基本使用
使用头文件:#include<queue>
构造:queue<Type, Container> (<数据类型,容器类型>)
初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型,也可以使用list类型但不能使用vector类型;
基本接口:
- push() 在队尾插入一个元素
- pop() 删除队列第一个元素
- size() 返回队列中元素个数
- empty() 如果队列空则返回true
- front() 返回队列中的第一个元素
- back() 返回队列中最后一个元素
#include<queue>
#include<list>
int main()
{
queue<int,deque<int>>que3;
queue<char,list<char>>que2;
queue<int,vector<int>>que;
que.push(3);
que.push(1);
que.push(9);
cout << que.front();
cout << que.back();
que.pop();
cout << que.front();
}
因为queue是要支持pop_front的,但是vector缺少,所以并不适用;
3.单调队列
单调队列就是让队列首部保持最大或者最小,用于找某个区间的最大最小值。
入队规则(求最大):如果元素小于队列尾部,那么循环弹出;
出对规则:如果要弹出的是队首元素则弹出,否则不操作;
class muque
{
public:
deque<int>que;
void push(int x)
{
while (!que.empty()&&x > que.back())
{
que.pop_back();
}
que.push_back(x);
}
int front()
{
return que.front();
}
};
int main()
{
muque que;
vector<int>vec = { 3,6,1,5,4,2 };
for (auto i : vec)
{
que.push(i);
cout<<que.front();
}
}
三.优先级队列
优先级队列就是在队列的基础上加上某种比较规则(优先级),出队时按照优先级最高的元素出队。排序是按照堆排序的方式。
头文件:#include<queue>
构造函数:
priority_queue<int,vector<int>,less<int>>que;
priority_queue<int,vector<int>,greater<int>>que;
第一个参数是数据类型,第二个是容器类型,第三个是优先级规则(默认是less,也就是大顶堆)
基本操作:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容