👀樊梓慕:个人主页
🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》《算法》
🌝每一个不曾起舞的日子,都是对生命的辜负
前言
stack与queue的实现比较简单,本篇不会有太大的篇幅,但值得我们学习的是『 适配器』的概念。
欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。
=========================================================================
GITEE相关代码:🌟fanfei_c的仓库🌟
=========================================================================
1.适配器
stack与queue并不属于容器,而是『 适配器』。
适配器其实就是对已经存在的容器进行封装得到的。
在STL标准库中,stack与queue的底层默认使用deque容器。
deque我们本篇文章不介绍,大家只需要知道他类似于vector与list,并且deque具有他们两个容器的特性即可。
适配器就像是我们的充电器,我国家庭电路电压为220v,但却可以通过不同的电源适配器达到不同的功率。
模板参数的这一用法我们上篇文章提到过:
当我们不传模板参数时,stack与queue都默认使用deque容器来构建栈或者队列,但我们也可以自己设定模板参数,就如同之前学习『 数据结构』时,栈或者队列既有顺序结构也有链式结构一样,在『 C++』中,我们只需要设定模板参数,即可实现顺序栈、顺序队列或者链栈、链队列,这就体现出了模板参数的妙用。
2.模拟实现源码
2.1stack
template<class T, class Container = deque<T>>
class stack
{
public:void push(const T& x){_con.push_back(x);}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;
};
2.2queue
template<class T, class Container = deque<T>>
class queue
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front(){return _con.front();}const T& back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;
};
2.3如何实现底层基于vector或list的栈或队列呢?
其实非常简单,就是将对应的模板参数设定为vector或list即可,比如:
int main()
{stack<int,vector<int>> s;s.push(1);s.push(2);s.push(3);s.push(4);while (!s.empty()){cout << s.top() << " ";s.pop();}cout << endl;return 0;
}
另外注意:
- 函数参数传参是在『 使用时传参』,传递的是『 对象』;
- 模板参数传参是在『 编译时传参』,传递的是『 类型』。