标题:[C++] STL :stack&&queue详解
@水墨不写bug
目录
- /**
- * _ooOoo_
- * o8888888o
- * 88" . "88
- * (| -_- |)
- * O\ = /O
- * ____/`---'\____
- * . ' \\| |// `.
- * / \\||| : |||// \
- * / _||||| -:- |||||- \
- * | | \\\ - /// | |
- * | \_| ''\---/'' | |
- * \ .-\__ `-` ___/-. /
- * ___`. .' /--.--\ `. . __
- * ."" '< `.___\_<|>_/___.' >'"".
- * | | : `- \`.;`\ _ /`;.`/ - ` : | |
- * \ \ `-. \_ __\ /__ _/ .-` / /
- * ======`-.____`-.___\_____/___.-`____.-'======
- * `=---='
- *
- * .............................................
- * 佛祖保佑 永无BUG
- */
正文开始:
通过查询cplusplus我们可以发现stack与以往的容器不同,比如vector;
比较上图,vector是一种容器;而栈是一种容器适配器。什么是容器适配器?在这里我们放在后文解释,我们首先了解一下什么是栈:
1.STL的栈是一种容器适配器,栈是一种数据结构,数据遵循后进先出,并且只能从栈的一端进行数据的插入与提取。
2.栈的功能实现比较简便,我们发现我们可以把vector或者是list当成是一个栈:能把vector或list当成一个栈,是可以把栈实现为容器适配器的原因。
容器适配器就是将一种特殊的类作为底层容器,并提供一组特定的成员函数来访问元素。
3.stack的成员函数比较少,功能简单:
函数说明 | 接口说明 |
stack() | 构造空的栈 |
empty() | 检测stack是否为空 |
size() | 返回stack中元素的个数 |
top() | 返回栈顶元素的引用 |
push() | 将元素val压入stack中 |
pop() | 将stack中尾部的元素弹出 |
这些成员函数的具体功能如果你有疑问,可以参考这一篇文章:《栈详解及C实现》
1.队列也是一种容器适配器,队列是一种数据结构,数据遵循先进先出,数据从容器一端进入,从另一端提取。
2.STL中,队列通过容器适配器方式实现,在这里,容器适配器就是通过封装一个特定的类,同时提供特定的接口成员函数来访问内部的元素数据。
3.常见的队列的成员函数有:
函数声明 | 接口说明 |
queue() | 构造空的队列 |
empty() | 检测队列是否为空,是返回true,否则返回false |
size() | 返回队列中有效元素的个数 |
front() | 返回队头元素的引用 |
back() | 返回队尾元素的引用 |
push() | 在队尾将元素val入队列 |
pop() | 将队头元素出队列 |
通过上文对两个容器适配器的讲述,你或许已经对容器适配器有了一定的认识。但是容器适配器到底是什么?
容器适配器是C++中一种特殊类型的容器,它通过封装现有的容器类实现不同的数据结构和功能。容器适配器通过提供不同的接口和封装现有容器的功能,使得程序员可以根据需求选择合适的数据结构。常见的容器适配器有栈(stack)、队列(queue)和优先队列(priority_queue)。
我们在使用容器适配器的时候,可以选择底层的容器,但是在使用容器适配器的时候,不需要关心底层实现的容器到底是什么。
比如:我们可以用vector容器或者list容器来实现stack的适配器,如果我们已经成功实现,在使用stack的时候,就不需要关心底层究竟是vector还是list了。
我们可以通过使用模板参数T,来使得容器内的数据类型更加灵活;通过设置一个参数Container来接受我们选择的容器。
模拟实现STL的stack源码:
- #pragma once
- #include
- #include
-
- using namespace std;
- namespace ddsm
- {
- template<class T,class Container = std::deque
> - class stack
- {
- public:
- void push(const T& val)
- {
- _con.push_back(val);
- }
- void pop()
- {
- _con.pop_back();
- }
- bool empty()
- {
- return _con.empty();
- }
- size_t size()
- {
- return _con.size();
- }
- T& top()
- {
- return _con.back();
- }
- private:
- Container _con;
- };
- }
模拟实现queue:
- #pragma once
- #include
-
- #include
- using namespace std;
- namespace ddsm
- {
- template<class T,class Container = std::deque
> - class queue
- {
- public:
- void push(const T& val)
- {
- _con.push_back(val);
- }
- void pop()
- {
- _con.pop_front();
- }
- T& front()
- {
- return _con.front();
- }
- T& back()
- {
- return _con.back();
- }
- bool empty()
- {
- return _con.empty();
- }
- size_t size()
- {
- return _con.size();
- }
- private:
- Container _con;
- };
- }
在模拟实现中,我们发现模板参数Container给了一个缺省参数deque;deque是STl的一种容器,它具有比vector和list更加复杂的结构,这里我们放在下次分享。
完~
未经作者同意禁止转载