一、前言
通过前面的学习,我们已经对string、vector和list类有了了解
本文中介绍的stack、queue和优先级队列相比于前面的容器而言接口较少,并且有了前面的基础,在学习这几个容器的使用和模拟实现时会更好上手。
因此,本文仅对接口的使用进行简单介绍,把重点放在优先级队列等部分。
二、stack类
2.1 了解stack
stack - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/stack/stack/通过文档,我们可以了解到以下的内容:
- 区别于vector等容器,stack是一种容器适配器。通俗的讲,stack封装了一个其他的容器,并提供特定的成员函数来对容器进行操作并遵循栈的后进先出(Last-in First-out)原则。
- stack的底层容器至少要支持以下操作:
- empty:判空
- size:获取容器有效元素个数
- back:获取容器尾部元素
- push_back:尾插
- pop_back:尾删
- 通过这些操作,我们就可以实现栈的压入和弹出等行为
- 我们可以指定vector、list和deque作为stack的底层容器,如果没有指定,默认情况下使用deque,后面会对该容器进行介绍。
2.2 使用stack
在实例化与stack类类似的容器适配器时,模板参数除了必须要传入元素类型,还可以选择传入底层容器的种类
例如:
(1)empty
bool empty() const;
检测栈是否为空
(2)size
size_type size() const;
返回stack中元素的个数
(3)top
value_type& top();
const value_type& top(); const
返回栈顶元素的引用
(4)push
void push(const value_type& val);
将val压入栈中
(5)pop
void pop();
将栈顶元素弹出
例如:
2.3 stack的模拟实现
前面提到,stack是一个容器适配器,其底层封装了其他的容器,这里我们以vector作为底层容器
namespace Eristic
{
template<class T, class Container = vector<T>>
//一个模板参数传入数据类型,一个模板参数传入底层容器
class stack
{
public:
void push(const T& val)
{
_con.push_back(val); //压栈即在容器尾部插入数据
}
void pop()
{
_con.pop_back(); //出栈即删除容器尾部的数据
}
const T& top()
{
return _con.back(); //栈顶元素即容器尾部的元素
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con; //对容器进行封装
};
}