前言
虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e7d58a94300f4dbda8d93d81777d2a69.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c9a19630b86c45d7950a1b7ed62ff132.png)
那么deque又是什么呢? 简单来说 就是一个双端队列
下图是在STL源码剖析中的介绍
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3018d49e16ea456a8c9f23853b06e381.png)
了解stack
stack的介绍
- stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
- stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
- stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下
操作:
empty:判空操作
back:获取尾部元素操作
push_back:尾部插入元素操作
pop_back:尾部删除元素操作 - 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3f633823bbd64638a9493cfbffdd45d6.png)
stack常用接口
函数说明 | 接口说明 |
---|
stack() | 构造空的栈 |
empty() | 检测stack是否为空 |
size() | 返回stack中元素的个数 |
top() | 返回栈顶元素的引用 |
push() | 将元素val压入stack中 |
pop() | 将stack中尾部的元素弹出 |
stack的模拟实现
namespace lsy {
template<class T, class Container = std::deque<T>>
class stack {
public:
void push_back(const T& x)
{
_con.push_back(x);
}
void pop() {
_con.pop_back();
}
T& top()
{
return _con.back();
}
const T& top() const {
return _con.back();
}
size_t size() {
return _con.size();
}
bool empty()const {
return _con.empty();
}
void swap(stack<T, Container>& sta)
{
_con.swap(sta._con);
}
private:
Container _con;
};
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e34ccc677de34cb69a13ae0f978fe3f4.png)
了解queue
queue的介绍
- 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
- 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
- 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
empty:检测队列是否为空
size:返回队列中有效元素的个数
front:返回队头元素的引用
back:返回队尾元素的引用
push_back:在队列尾部入队列
pop_front:在队列头部出队列 - 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cc1f839037304afc8993c28e1fc3e1b5.png)
queue常用接口
成员函数 | 函数作用 | 实现方法 |
---|
push | 队尾入队列 | 调用所指定容器的push_back |
pop | 队头出队列 | 调用所指定容器的pop_front |
front | 获取队头元素 | 调用所指定容器的front |
back | 获取队尾元素 | 调用所指定容器的back |
size | 获取队列中有效元素个数 | 调用所指定容器的size |
empty | 判断队列是否为空 | 调用所指定容器的empty |
swap | 交换两个队列中的数据 | 调用所指定容器的swap |
queue的模拟实现
namespace lsy {
template<class T, class Container = std::deque<T>>
class queue {
public:
void push(const T& x) {
_con.push_back(x);
}
void pop() {
_con.pop_front();
}
T& front() {
return _con.front();
}
const T& front() const{
return _con.front;
}
T& back() {
return _con.back();
}
const T& back() const{
return _con.back();
}
size_t size() {
return _con.size();
}
bool empty() {
return _con.empty();
}
void swap(queue<T, Container>& que) {
_con.swap(que._con);
}
private:
Container _con;
};
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e8ef3c2dfb164b3fb387fdba08717326.png)