目录
前言
一、stack模拟实现
二、queue的模拟实现
前言
前面也介绍了stack和queue的常见接口,我们也知道stack和queue实际上是一种容器适配器,它们只不过是对底层容器的接口进行封装而已,所以模拟实现起来比较简单!一起来看看是怎么个事!额……其实也就那么回事!(hhh)
一、stack模拟实现
复习一下常见接口:
empty() | 判断栈是否为空 |
size() | 返回栈的元素个数 |
top() | 返回栈顶元素的引用 |
push() | 将元素压入栈 |
pop() | 栈顶元素出栈 |
这里直接上代码:
#include <deque>
#include <iostream>
using namespace std;
namespace st
{template<class T, class Con = deque<T>>//给半缺省,因为栈有链栈和数字栈class stack{public: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 //对于这种无需改变的最好加上const{return _c.size();}bool empty()const{return _c.empty();}private:Con _c;};
};
可能会有一个疑问,为什么它不写构造函数呢?其实前面已经讲过,stack在STL库里不把它看作容器,而是一种适配器,它的成员变量实际就是对于容器所实例化出来的对象,也算是一种自定义类型,对于自定义类型,会自动去调用对于的类型去完成构造!(queue同理!)
二、queue的模拟实现
复习一下常用接口:
empty() | 判断队列是否为空,bool类型 |
size() | 返回有效数据个数 |
front() | 返回队头元素的引用 |
back() | 返回队尾元素的引用 |
push() | 入队列 |
pop() | 出队列 |
同样也是直接上代码:
#include<deque>
#include<iostream>using namespace std;namespace qu
{template<class T, class Con = deque<T>>//ȱʡclass queue{public:void push(const T& x){_c.push_back(x);}void pop(){_c.pop_front();}T& back(){return _c.back();}const T& back()const{return _c.back();}T& front(){return _c.front();}const T& front()const{return _c.front();}size_t size()const{return _c.size();}bool empty()const{return _c.empty();}private:Con _c;};
};
再一次不难看出,两个的模拟实现都是在用其他容器的接口来封装自己,就能够转化得到为我们所需要的东西!这也算是属于适配器的一大特点!不费吹灰之力就能得到所需~
好了,今天的分享就到这里!如有不足,欢迎评论,如还可以,持续关注!