目录
前言
一、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;
};
};
再一次不难看出,两个的模拟实现都是在用其他容器的接口来封装自己,就能够转化得到为我们所需要的东西!这也算是属于适配器的一大特点!不费吹灰之力就能得到所需~
好了,今天的分享就到这里!如有不足,欢迎评论,如还可以,持续关注!