s t a c k stack stack 是一种容器适配器,设计为先进后出( F i r s t I n L a s t O u t , F I L O First\ In\ Last\ Out,\ FILO First In Last Out, FILO)的数据结构,只有一个出口,将元素推入栈的操作称为 p u s h push push, 将元素推出栈的操作称为 p o p pop pop。因此,只要能满足栈结构要求的容器都可以作为 s t a c k stack stack 的底层容器。同时,由于 s t a c k stack stack 不允许有遍历行为(只能取栈顶元素),因此 s t a c k stack stack 没有迭代器。
文章目录
- 前言 —— 容器适配器
- 一、stack 的介绍
- 二、stack 的使用(常用接口)
- 三、stack 的模拟实现
- 四、STL 标准库中的 stack
- 1. 底层结构
- 2. 模拟实现
- 总结
前言 —— 容器适配器
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
一、stack 的介绍
关于 s t a c k stack stack 的介绍,建议去查 C C C++ 官方文档: s t a c k stack stack 的文档介绍。
以下为 s t a c k stack stack 的官方文档介绍:
-
栈是一种容器适配器,专门设计用于在 L I F O LIFO LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。
-
栈作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一组特定的成员函数来访问其元素。元素从特定容器的 “ b a c k ” “back” “back” 推送 / / /弹出,这称为栈的顶部。
-
底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
(1)empty:检测栈是否为空。
(2)size:返回栈中有效元素的个数。
(3)back:返回栈顶元素的引用。
(4)push_back:在栈顶压栈。
(5)pop_back:在栈顶出栈。
-
标准容器类 d e q u e deque deque 和 v e c t o r vector vector 满足了这些要求。默认情况下,如果没有为 s t a c k stack stack 实例化指定容器类,则使用标准容器。
二、stack 的使用(常用接口)
下面只列举了 s t a c k stack stack 最常用的几个接口,更多详细信息可以自行查官方文档: s t a c k stack stack。
可以看出 s t a c k stack stack 和 v e c t o r vector vector 和 l i s t list list 都不一样,第二个模板参数从 alloc
变为了 Container
,缺省值说明标准库里的 s t a c k stack stack 默认为 d e q u e deque deque 容器的容器适配器:
t e m p l a t e < c l a s s T , c l a s s C o n t a i n e r = d e q u e < T > > c l a s s s t a c k ; template <class\ T, class\ Container = deque<T> > class\ stack; template<class T,class Container=deque<T>>class stack;
函数说明 | 接口说明 |
---|---|
s t a c k ( ) stack() stack() | 构造空的栈 |
e m p t y ( ) empty() empty() | 检测 s t a c k stack stack 是否为空 |
s i z e ( ) size() size() | 返回 s t a c k stack stack 中元素的个数 |
t o p ( ) top() top() | 返回栈顶元素的引用 |
p u s h ( ) push() push() | 将元素 v a l val val 压入 s t a c k stack stack 中 |
p o p ( ) pop() pop() | 将 s t a c k stack stack 中尾部的元素弹出 |
三、stack 的模拟实现
从栈的接口中可以看出,栈实际是一种特殊的 v e c t o r vector vector,因此使用 v e c t o r vector vector 完全可以模拟实现 s t a c k stack stack。
也就是说, s t a c k stack stack 作为容器适配器,是直接封装其他容器的部分功能,只要能实现 s t a c k stack stack 的基本功能,就能够作为 s t a c k stack stack 的底层实现容器,如: v e c t o r vector vector、 l i s t list list、 d e q u e deque deque。
这里使用 v e c t o r vector vector 容器为底层默认容器来模拟实现的 s t a c k stack stack:
#include<vector>using namespace std;namespace ybc
{//用 Container 适配转换出 stacktemplate<class T, class Container = vector<T>> //给vector缺省值class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con; //底层可以使用 vector/list/deque 容器};
}
注意:类模板实例化时,会按需实例化:使用了哪些成员函数,就实例化哪些成员函数(不会全实例化)。
四、STL 标准库中的 stack
1. 底层结构
虽然 s t a c k stack stack 中也可以存放元素,但在 S T L STL STL 中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为 s t a c k stack stack 只是对其他容器的接口进行了包装, S T L STL STL 中 s t a c k stack stack 默认使用 d e q u e deque deque:
关于 d e q u e deque deque 的介绍可以看我的这篇博客:【STL】 d e q u e deque deque(了解),仅供了解,这里不过多介绍。
2. 模拟实现
#include<vector>
#include<list>
#include<deque>using namespace std;namespace ybc
{//template<class T, class Con = vector<T>>//template<class T, class Con = list<T>>template<class T, class Con = deque<T>>class stack{public:stack() {}void push(const T& x) {_c.push_back(x);}void pop() {_c.pop_back(); }T& top() {return _c.back();}const T& top() const {return _c.back();}size_t size() const {return _c.size();}bool empty() const {return _c.empty();}private:Con _c;};
}
总结
以某种既有容器为底部结构,将其接口改变,使其符合 “ “ “先进后出 ” ” ” 的特性,形成一个 s t a c k stack stack,是很容易做到的。 d e q u e deque deque 是双向开口的数据结构,若以 d e q u e deque deque 为底部结构并封闭其头端开口,便轻而易举地形成了一个 s t a c k stack stack。因此, S G I SGI SGI S T L STL STL 便以 d e q u e deque deque 作为默认情况下的 s t a c k stack stack 底部结构。
由于 s t a c k stack stack 是以底部容器完成其所有工作,而具有这种 “ “ “修改某物接口,形成另一种风貌 ” ” ” 的性质的,称为 a d a p t e r adapter adapter(适配器),因此, S T L STL STL s t a c k stack stack 往往不被归类为 c o n t a i n e r container container(容器),而被归类为 c o n t a i n e r a d a p t e r container\ adapter container adapter(容器适配器)。