在前面的介绍中我们已经知道了queue和stack是一个容器适配器,它并没有被划分到容器的行列,它只是对其他容器的再封装,在STL中queue和stack默认使用的容器是deque
在数据结构的学习中,我们知道stack和queue可以使用顺序表和链表实现,若我们在这里定义一个vector让stack进行包装实现,实际上就是stack中的每个接口的实现都复用了vector的接口
Stack的模拟实现
stack接口:
成员函数 | 函数功能 | 实现方法 |
push | 元素入栈 | 调用指定容器的push_back |
pop | 元素出栈 | 调用指定容器的pop_back |
top | 获取栈顶元素 | 调用指定容器的back |
size | 获取栈中元素个数 | 调用指定容器的front |
empty | 判断栈中是否有元素 | 调用指容器的empty |
swap | 交换两个栈的数据 | 调用指定容器的swap |
模拟实现:
template<class T, class container>
class stack
{
public:void push(const T& s){return _con.push_back(s);}void pop(){_con.pop_back();}T& top(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}void swap(stack<T, container>& s){_con.swap(s);}
private:container _con;
};
Queue的模拟实现
queue接口:
成员函数 | 函数功能 | 实现方法 |
push | 元素入队列 | 调用指定容器push_back |
pop | 删除队头元素 | 调用指定容器pop_back |
front | 获取队头元素 | 调用指定容器front |
back | 获取队尾元素 | 调用指定容器back |
size | 获取有效元素个数 | 调用指定容器size |
empty | 判断队列是否为空 | 调用指定容器empty |
swap | 交换两个队列元素 | 调用指定容器swap |
template<class T, class container = deque<T>>
class queue
{
public:void push(const T& val){_con.push_back(val);}void pop(){_con.erase(_con.begin());}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>& Q){_con.swap(Q);}
private:container _con;
};
以上就完成了对stack和queue的实现,很简单