【STL】stack、queue基本使用和模拟实现

news/2025/1/15 17:47:53/

目录

前言

stack

接口介绍

模拟实现

queue

接口介绍

模拟实现

没有迭代器 

deque介绍


前言

stack 和 queue 本质上是一种容器配接器,就像我们平时充电时使用的电源适配器,能够将电压转换成设备能够接受的程度。

其通过封装特定容器作为其底层容器的类,通过一组特定的成员函数来实现结构的功能。


stack

🍑stack 就是 STL 中封装好的栈,在使用的时候我们不仅可以指定内部的数据类型,还可以指定内部的容器

🍑不指定容器其实也是可以的,内部的模板参数有一个缺省值

int main()
{stack<int, vector<int>> s1;     //内部容器为vectorstack<int, list<int>> s2;       //内部容器为liststack<int> s3;                  //内部为默认容器dequereturn 0;
}

接口介绍

🍑库中还提供了一系列的接口,我们以前如何使用栈就如何使用 stack 即可,下面用一系列代码来示例一下。 

int main()
{stack<int> s;s.push(5);          //5s.push(6);          //5 6s.push(7);          //5 6 7s.push(8);          //5 6 7 8cout << s.size() << endl;   //打印栈的大小while (!s.empty())        //直到栈为空循环{cout << s.top() << endl;   //打印栈顶元素s.pop();                   //出栈}return 0;
}

 

模拟实现

🍑根据库中接口简单地实现一下 stack,需要注意的是这里复用的接口需要确保几个底部容器都要同时拥有

namespace Alpaca
{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;      //容器对象};
}

queue

🍑queue 则是封装出来的队列,与 stack 相反遵循着先进先出的原则(FIFO)。

🍑通过查询资料我们还发现,要作为 queue 的容器还需要支持以下操作:

🍑同样,使用 queue 时模板参数有两个,分别是内部元素的类型和内部容器,且内部容器缺省为 deque。

int main()
{queue<int> q1;                //传递缺省模板参数queue<int, list<int>> q2;     //指定内部容器为listreturn 0;
}

接口介绍

🍑队列与栈相反,其只在队尾入队,在队头出队。我们可以通过实例代码简单使用一下。

int main()
{queue<int> q;cout << "size is: " << q.size() << endl;   //查看队列大小q.push(1);                                 //数据入队q.push(2);q.push(3);q.push(4);q.push(5);cout << "size is: " << q.size() << endl;   cout << "first is: " << q.front() << endl; //查看首元素cout << "last is: " << q.back() << endl;   //查看最后一个元素while (!q.empty())                         //直到队空循环{cout << q.front() << " ";              //打印队头q.pop();                               //出队}cout << endl;cout << "size is: " << q.size() << endl;   //查看队列大小return 0;
}

模拟实现

🍑由于是泛型在使用的时候并不会对内部函数进行提示,简单理解就是我们复用对应容器的接口来实现队列的接口函数

namespace Alpaca
{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;};}

没有迭代器 

🍑因为无论是 stack 和 queue 都是根据其特定的顺序进行元素的插入和删除,因此二者都不提供走访功能,也不提供迭代器。

deque介绍

🍑在出现 vector 和 list 之后,有人想到 vector 能够随机读取,但扩容和随机插入删除效率较低,而 list 插入删除效率都极高却无法随机访问,能不能实现一个结构能够同时兼顾 vector 和 list 的优点呢?

🍑于是 deque 就诞生了,deque 又叫双端队列,即一种双向开口的连续线性空间

🍑为了兼顾双端插入以及随机访问,deque 的底层是使用一个中控数组来管理一个个连续的空间,且第一个空间被开辟出来后是存放在中控数组的中央位置,之后不断插入数据,若一块连续空间已满只需要再开一块连续空间即可。也就是在中控数组中再增加一个指针。

🍑若是进行头插,则需要开辟一段新空间,将新的值存于连续空间的尾部

🍑得益于这种结构,即便是扩容所带来的拷贝消耗也是极低的,实际上不会像 vector 那样复杂的深拷贝,而只是对中控数组中的指针进行拷贝。同时  deque 也支持随机访问,只要直到每个连续空间的大小通过简单的计算便可以实现随机访问。

🍑若 deque 有这么多的有点,那为什么它还没有取代 vector 和 list 呢?这就不得不提到 deque 最为鸡肋的地方了,中部的插入删除操作相当复杂,若是直接在中部插入就要挪动当前空间的数据,更甚者还要牵扯到接下来的连续空间。不仅如此 deque 提供的优点不如 vector 和 list 那样极致,这也是为什么 deque 代替不了二者的原因。

🍑但若是有一种容器并不需要中间的插入删除,只需要在两端进行插入删除呢?于是 deque 就成为了适合 stack 和 queue 实现的内部容器


🍑好了,今天 stack、queue基本使用和模拟实现 的相关内容到这里就结束了,如果这篇文章对你有用的话还请留下你的三连加关注。


http://www.ppmy.cn/news/188814.html

相关文章

基于springboot框架的电脑商城项目(五)

&#x1f381;&#x1f381;静态资源及sql文件分享 链接&#xff1a;https://pan.baidu.com/s/1X-yjmQcPD3PqS21x0HplNA?pwd23gr 提取码&#xff1a;23gr 收货地址列表展示功能及设置默认收货地址功能的实现 收货地址列表展示&#xff08;一&#xff09;收货地址列表展示&…

机器人布里茨哪个皮肤好看_LOL全英雄皮肤盘点推荐D32:蒸汽机器人布里茨 苹果机器人...

LOL全英雄皮肤盘点推荐今天带来蒸汽机器人布里茨的苹果机器人。经常在节日半价的皮肤&#xff0c;q技能诡异的弹道让人非常难躲&#xff0c;模型很精致&#xff0c;而其他特效皮肤&#xff0c;轮椅使用率最高&#xff0c;不过特效上不如苹果。此外电玩的脑子感觉勾到人有一种让…

MacOS Big Sur 11.2.3 (20D91) with Clover 5131 and OC 0.6.7 and PE 三EFI分区原版DMG黑苹果镜像

MacOS Big Sur 11.2.3 (20D91) 原版 DMG 黑苹果镜像&#xff0c;基于 OpenCore-0.6.7 and Clover 5131制作。 2021 年 3 月 8 日苹果推送了macOS Big Sur 11.2.3&#xff0c;作为生产力工具&#xff0c;系统更新如此频繁&#xff0c;着实让然头大。这几次补充更新都是问题修复&…

D3 pie

https://github.com/d3/d3/blob/master/API.md#pies <script>svg d3.select(body).append(svg).attr("width",300).attr(height,300)data[["女生",43],["男生",57]]//设置pie布局转换器var pie d3.layout.pie().value((d)>d[1])//将数…

2D 23.2.23

2023.2.21 2D 平移属性&#xff1a;transform:translate(x,y)&#xff1b; 变换属性&#xff1a; transform:translate(x,y)&#xff1b;沿着x轴和y轴移动 transform:translateX(x)&#xff1b;沿着x轴移动 transform:translateY()&#xff1b;沿着y轴移动 取值&#xf…

dagre-d3 基于d3.js v4版本以上

dagre-d3 github 上没有文档介绍 看dagre.js的吧 基于d3.js v4以上 dagre.js github https://github.com/dagrejs/dagre/wiki dagre-d3 github https://github.com/dagrejs/dagre-d3/wiki 基于d3 v3 和 v4 的变化 https://github.com/dagrejs/dagre-d3/commit/ebbb84f03b…

macOS 12 Monterey Beta 3版

Mac 操作系统的下一版本将被称为 macOS Monterey。这里为您带来macOS Monterey测试版尝鲜下载&#xff01; 升级可以参考下方教程&#xff01; macOS 12 Monterey免费下载及升级安装教程 macOS Big Sur 12 安装教程 下载完成后打开&#xff0c;双击.pkg安装包运行即可检测到最…

d3.js:取代d3.mouse的d3.pointer

前言 今天在学习如何使用d3.js的事件处理函数过程中&#xff0c;发现d3.mouse和d3.event在浏览器报错不是函数&#xff0c;于是前往官方文档&#xff0c;发现这里两个函数已经在d3V6.0中删除了&#xff01;于是&#xff0c;我在往上查了好久&#xff0c;没有查到替代的函数&am…