STL之stack和queue

news/2024/11/29 10:58:16/

目录

  • stack和queue模拟实现
    • 一.介绍
      • 1.stack的类模板
      • 2.queue的类模板
      • 3.容器适配器
    • 二. deque类
      • 1. 简介
      • 2.常用成员函数
    • 三. stack模拟实现
      • 1.成员函数
      • 2.代码
    • 四.queue的模拟实现
      • 1.成员函数
      • 2.代码
    • 五.小结
      • 1.容器适配器

stack和queue模拟实现

一.介绍

1.stack的类模板

在这里插入图片描述

LIFO:后进先出

2.queue的类模板

在这里插入图片描述

FIFO:先进先出

3.容器适配器

在stack与queue的介绍中,都有介绍其是容器适配器(container adaptor)的一种,对于适配的模式,反向迭代器也使用了同样的思想

template <class T, class Container = deque<T> > 

其模板参数中Container就是其所适配的类的类型,缺省参数为deque

二. deque类

使用STL中的deque时需要包含头文件#include <deque>,并用std::命名空间

1. 简介

deque:是双端队列(double-ended queues),可以在头尾两端进行插入和删除。

示例:下图中,先尾插 1 2 3 4 5,再头插 0 -1。后的结构图示

在这里插入图片描述

详细可见另一篇博主的优质好文:deque(双端队列)容器

是由于容器vector与liste其各有优点

vector:随机访问([]),效率高

list:插入删除,效率高

因此,有大佬期望能够结合这两个容器的优点来设计一个新的容器,于是deque就诞生了。

deque:头尾插入效率高,不需要移动元素;支持随机访问(但比vecotr的效率低)。

但是其也有自身的缺陷:在中间插入元素时,也需要挪动数据,效率低;不适合遍历(需要检查并转跳到其他的小空间buffer)。

因此,在实际中,可能经常需要遍历,大多数情况下,还是回优先考虑vector或list。deque的使用并不多,目前的一个就是:在STL中,被用来作为stack和queue的底层数据结构。

2.常用成员函数

在这里插入图片描述在这里插入图片描述在这里插入图片描述

三. stack模拟实现

1.成员函数

在这里插入图片描述

2.代码

#include <deque>
namespace yyjs
{template<class T, class Container = std::deque<T>>class stack{public:void push(const T& x){_c.push_back(x);}void pop(){_c.pop_back();}T& top(){return _c.back();}const T& top() const{return  _c.back();}size_t size() const{return _c.size();}bool empty() const{return _c.empty();}private:Container _c;};   
}

可以发现,对于stack类的模拟实现,都是对其Container类型的成员变量进行的适配

四.queue的模拟实现

1.成员函数

在这里插入图片描述

2.代码

#include <deque>namespace yyjs
{template<class T, class Container = std::deque<T>>class queue{public:void push(const T& x){_c.push_back(x);}void pop(){_c.pop_front();}T& back(){return _c.back();}const T& back() const{return _c.back();}T& front(){return _c.front();}const T& front() const{return _c.front();}size_t size() const{return _c.size();}bool empty() const{return _c.empty();}private:Container _c;};
}

对于queue类的模拟实现,也是对其Container类型的成员变量进行的适配

五.小结

1.容器适配器

对于stackqueue的使用时,对于第二个模板参数可以不传参,也可以指定其底层数据结构

//<int ,deque<int>>
stack<int> sti;
//<int, vector<int>>
stack<int, std::vector<int>> stiv;

需要Container类中实现的有stack成员函数里所调用的empty()、size()、push_back()、pop_front()等函数,才能做为第二个模板参数传入。但是一般不传参,使用deque。

queue同上


🦀🦀观看~~


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

相关文章

蓝牙耳机什么牌子的好,蓝牙耳机十大品牌榜单

蓝牙耳机什么牌子的好&#xff01;耳机已然成为了很多年轻人出门的必备数码装备&#xff0c;对于现在喜欢简单生活的他们来说&#xff0c;现在的耳机很多都采用了有线连接&#xff0c;让用户聆听的时候还需要解开线团&#xff0c;非常的麻烦&#xff0c;蓝牙耳机的出现就帮助用…

这是我见过最通俗易懂的装饰者模式讲解!

关注“Java架构栈”微信公众号&#xff0c;回复暗号【Java面试题】即可获取大厂面试题 前言 本文主要讲述装饰者模式&#xff0c;文中使用通俗易懂的案例&#xff0c;使你更好的学习本章知识点并理解原理&#xff0c;做到有道无术。 什么是装饰者模式 装饰者模式是23种设计模式…

Android:OKHttp

特点 支持HTTP2/SPDYSocket自动选择最好路线&#xff0c;并支持自动重连拥有自动维护的Socket连接池&#xff0c;减少握手次数拥有队列线程池&#xff0c;轻松写并发拥有Interceptors轻松处理请求与响应&#xff08;比如透明GZIP压缩&#xff09;实现基于Headers的缓存策略 基…

springmvc应对vue跨域解决

方法很简单 这里使用的是spring4以上<mvc:cors><mvc:mapping path"/**" allowed-origins"*" allow-credentials"true" max-age"1800" allowed-methods"GET,POST,OPTIONS"/> </mvc:cors> 解决方案转自 海畅…

支持右翼教科书的日本企业与个人全部名单

企业&#xff1a; 朝日啤酒、三菱重工、日野汽车、五十铃汽车、住友生命、味之素、东京三菱银行、清水建设、中外制药、大成建设。 个人&#xff1a; 企业前会长、顾问、社长 粕谷哲夫 商业咨询顾问小野泽知之 光企画顾问河野正三 高龄者住宅财团理事长小林乔 富国生命保险…

感谢你们投票给了鸡腿

我们的鸡腿有肉 非常感谢“”海畅智慧“”软件的朋友&#xff0c;想想吧八千人的喜爱&#xff0c;我敢肯定原因就是下面我要说的。 你想要不只是整理硬盘视频 本周我们收到一封来自 陈萍 用户的电子邮件&#xff0c;内容如下&#xff1a; 我对你们的软件失望至极&#xff0c…

腿粗适合穿什么样裤型牛仔裤?

走在街上&#xff0c;看看周边的女孩&#xff0c;有一多半的人都穿着牛仔裤。但不是每种款式的牛仔裤都适合每种体型的人穿。那你知道腿粗的人适合穿什么样裤型的牛仔裤吗&#xff1f;如果你的腿粗&#xff0c;又不清楚什么样裤型的牛仔裤适合你穿着&#xff0c;就来这里看看吧…

有趣的数学,给你的机器学习增加点信心

相似的判断 下面两个句子相同吗&#xff1f;怎么判断&#xff1f;思路呢&#xff1f; 句子A&#xff1a;这只皮靴号码大了。那只号码合适 句子B&#xff1a;这只皮靴号码不小&#xff0c;那只更合适 1&#xff09;分词 句子A&#xff1a;这只/皮靴/号码/大了。那只/号码/合…