什么是stack
stack就是平常所说的栈,栈只能进行在固定的一端插入数据和删除数据的操作,也就是先进后出,后进先出
什么是queue
queue是平常所说的队列,队列就像平常排队吃饭一样,先到的就有饭吃,只能从一端进,另一端出,也就是先入队的先出队,后入队的后出队
容器适配器
在cplusplus官网上可以看到
这里的模板都有两个,第一模板T就不必多说了,第二个是一个缺省参数container。虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器
也就是说stack和queue可以用不同的容器来实现,但是不同容器带来的复杂性也不同。在这里我们就是用默认的容器deque来模拟实现。
stack模拟实现
stack模拟实现中,由于c++的方便性,库里已经给出了我们所需要的各种函数,所以我们只需要调用使用的容器的函数即可
例如栈是先进后出,那么我们在入栈的时候就调用尾插push_back函数,出栈的时候就调用尾删pop_back函数,以此类推
namespace bear
{
//stack
template<class T, class Container = std::deque<T>>
class stack
{
public:
//元素入栈
void push(const T& x)
{
_con.push_back(x);
}
//元素出栈
void pop()
{
_con.pop_back();
}
//获取栈顶元素
T& top()
{
return _con.back();
}
const T& top() const
{
return _con.back();
}
//获取栈中有效元素个数
size_t size() const
{
return _con.size();
}
//判断栈是否为空
bool empty() const
{
return _con.empty();
}
//交换两个栈中的数据
void swap(stack<T, Container>& st)
{
_con.swap(st._con);
}
private:
Container _con;
};
}
queue模拟实现
在queue的模拟实现中,由于队列的特性,先进的先出没,后进的后出,那么我们在入队列的时候调用尾插push_back函数,出队列的时候调用头删pop_front函数即可,依次类推
namespace bear
{
//queue
template<class T, class Container = std::deque<T>>
class queue
{
public:
//队尾入队列
void push(const T& x)
{
_con.push_back(x);
}
//队头出队列
void pop()
{
_con.pop_front();
}
//获取队头元素
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() const
{
return _con.size();
}
//判断队列是否为空
bool empty() const
{
return _con.empty();
}
//交换两个队列中的数据
void swap(queue<T, Container>& q)
{
_con.swap(q._con);
}
private:
Container _con;
};
}