[C++随笔录] stack queue模拟实现

stack && queue模拟实现

  • stack的实现
  • stack测试用例
  • queue的实现
  • queue测试用例
  • deque

stack的实现

🗨️stack的容器适配器应该选什么比较好呢?

  • 首先, stack的特点是 头部入, 尾部出尾插 和 尾删操作比较频繁
    我们前面学过的容器有 vector 和 list,
    vector 和 list的尾插 和 尾删的时间复杂度是 O(1), 还是适合做容器适配器的.

stack的基本结构

template<class T, class Continer = vector<T>> // 默认容器适配器是vector
class stack
{private:Continer _con; // 维护这个容器对象就可以了
};

用这个容器对象来进行模拟实现stack


按照我们之前的想法, 容器适配器要么是 vector, 要么是 list.
这两者都是 自定义类型 ⇒ 自定义类型会调用它的默认构造 ⇒ 我们都不用写构造函数的


  1. push
void push(const T& val)
{_con.push_back(val);
}
  1. pop
void pop()
{_con.pop_back();
}
  1. size
const T& top() const
{return _con.back();
}
  1. empty
bool empty() const
{return _con.size() == 0;
}
  1. top
const T& top() const
{return _con.back();
}

stack测试用例

void test_stack()
{muyu::stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);cout << "size->" << st.size() << endl;while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;st.push(2);st.push(3);st.push(4);st.pop();st.pop();cout << "size->" << st.size() << endl;while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;}

queue的实现

🗨️queue的容器适配器能不能用 vector? 能不能使用list?

  • 首先, queue的特点是 队尾入, 对头出尾插, 头删操作比较频繁
    其次, 我们来考量vector 和 list的尾插 和 头删效率如何?
    vector的尾插是O(1), 头删是O(n )且 没有pop_front函数
    list的尾插是O(1), 头删也是O(1) 且 有pop_front函数
    ⇒ 所以, 我们queue的容器适配器, list 比 vector更适合

queue的基本结构

	template<class T, class Continer = list<T>> // 默认容器适配器是listclass queue{private:Continer _con; // 维护容器对象};

  1. push
void push(const T& val = T())
{_con.push_back(val);
}
  1. pop
void pop()
{_con.pop_front();
}
  1. front
const T& front() const
{return _con.front();
}
  1. back
const T& back() const
{return _con.back();
}
  1. empty
bool empty() const
{return _con.size() == 0;
}
  1. size
size_t size() const
{return _con.size();
}

queue测试用例

void test_queue()
{muyu::queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);cout << "front->" << q.front() << endl;cout << "back->" << q.back() << endl;cout << "size->" << q.size() << endl;cout << endl;q.pop();q.pop();cout << "front->" << q.front() << endl;cout << "back->" << q.back() << endl;cout << "size->" << q.size() << endl;cout << endl;while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;}

deque


源码中, stack 和 queue的默认容器适配器给的是 deque.

我们来看一下deque的接口函数

我们惊奇的发现: deque不仅可以支持随机访问 [], 还支持 头插, 头删, 尾插, 尾删. 这不妥妥地是 vector 和 list 的结合体嘛.

🗨️那deque这么厉害, 我们之前为啥没有听过呢?

  • 由于这个容器不值得我们去深度学习, 我这里就偷点懒, 盗用航哥的图了!

禅宗说了‘人人都有佛性’后就枯坐,什么都不管了。说了‘佛向心头做’后就真的在心头做,不去实践。而我说了‘在心上用功’后,必须去实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/92688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue中如何进行图表绘制

Vue中的图表绘制&#xff1a;数据可视化的艺术 数据可视化是现代Web应用程序的重要组成部分之一。Vue.js作为一种流行的JavaScript框架&#xff0c;提供了许多强大的工具和库&#xff0c;用于在前端应用程序中创建各种图表和数据可视化。本文将深入探讨在Vue中进行图表绘制的方…

以太网协议介绍(ARP、UDP、ICMP、IP)

以太网协议介绍 一、ARP协议 请求&#xff1a; 应答&#xff1a; ARP协议&#xff1a; 0x0001 0x0800 6 4硬件类型&#xff1a;2个字节&#xff0c;arp协议不仅能在以太网上运行还能在其他类型的硬件上运行。以太网用1来表示&#xff1b; 协议类型&#xff1a;两字节。指的是a…

【深入了解Java String类】

目录 String类 常用方法 字符串的不可变性 String的内存分析 StringBuilder类 解释可变和不可变字符串 常用方法 面试题&#xff1a;String&#xff0c;StringBuilder&#xff0c;StringBuffer之间的区别和联系 String类的OJ练习 String类 【1】直接使用&#xff0c…

【JUC并发编程--java线程】

文章目录 1. 线程1.1 线程的使用线程运行原理 1. 线程 1.1 线程的使用 方法一&#xff0c;直接使用 Thread&#xff1a; 方法二&#xff0c;使用 Runnable 配合 Thread&#xff1a; 把【线程】和【任务】&#xff08;要执行的代码&#xff09;分开 Thread 代表线程Runnabl…

Java基础面试,String,StringBuffer,StringBuilder区别以及使用场景

简单的几句 String是final修饰的&#xff0c;不可变&#xff0c;每次操作都会产生新的对象。StringBuffer和StringBuilder都是在原对象上进行操作StringBuffer是线程安全的&#xff0c;StringBuilder是线程不安全的。StringBuffer方法是被synchronized修饰的 所以在性能方面大…

百度2024校招机器学习、数据挖掘、自然语言处理方向面试经历

本文介绍2024届秋招中&#xff0c;百度的机器学习/数据挖掘/自然语言处理工程师岗位一面的面试基本情况、提问问题、代码题目等。 8月初参与了百度提前批的机器学习/数据挖掘/自然语言处理工程师岗位面试&#xff0c;所在部门是搜索方向的。一面结束之后就知道凉了&#xff0c;…

为什么都说NFS读写性能差,如何进行优化?

使用基于NFS协议存储系统的同学经常遇到的问题是在小文件比较多的情况下性能会比较差。小文件访问性能差本身是可以理解的,但是NFS确实是太差了。不知大家是否深层次分析过,为什么NFS访问小文件性能会这么差? NFS文件系统与本地文件系统的差异在于多了一个网络传输的过程。…

shell脚本之环境变量

文章目录 常见系统的环境变量用户定义的环境变量 常见系统的环境变量 常见的环境变量&#xff1a; 1&#xff09;$HOME 当前用户的家目录路径。 2&#xff09;$UID和$EUID 当前用户的用户ID和有效用户ID。 3&#xff09;$PPID 当前进程的父进程的进程ID。 4&#xff09;$P…

毛玻璃用户卡交互

效果展示 页面结构组成 从效果展示可以看到&#xff0c;此效果都是比较常规的。主要的核心就是卡片的悬停效果。 CSS 知识点 backdrop-filter 回顾transitiontransform 页面基础布局实现 <section><div class"container"><div class"card&q…

react create-react-app v5配置 px2rem (暴露 eject方式)

环境信息&#xff1a; create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤&#xff1a; 我这个方式是 npm run eject 暴露 webpack配置的方法 1.安装 postcss-plugin-px2rem 和 lib-flexible cnpm install postcss-plugin-px2rem…

二叉树和堆

二叉树不存在度大于2的结点&#xff08;每个根最多只有两个子结点&#xff09;二叉树的子树有左右之分&#xff0c;次序不能颠倒&#xff0c;因此二叉树是有序树 两个特殊的二叉树——&#xff08;满二叉树&#xff0c;完全二叉树&#xff09; 满二叉树——每个根结点都有左右…

Ubuntu镜像源cn.arichinve.ubuntu.com不可用原因分析和解决

文章目录 Ubuntu查看系统版本Ubuntu更新系统不能更新Ubuntu查看APT更新源配置cn.archive.ubuntu.com已经自动跳转到清华镜像站Ubuntu变更镜像源地址备份原文件批量在VIM中变更 Ubuntu国内镜像站推荐推荐阅读 今天想要在Ubuntu环境下搭建一个测试环境&#xff0c;进入Ubuntu系统…

react create-react-app v5 从零搭建项目

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

MySQL学习笔记27

MySQL主从复制的核心思路&#xff1a; 1、slave必须安装相同版本的mysql数据库软件。 2、master端必须开启二进制日志&#xff0c;slave端必须开启relay log 日志。 3、master主服务器和slave从服务器的server-id号不能一致。 4、slave端配置向master端来同步数据。 master…

南京大学【软件分析】07 Interprocedural Analysis

文章目录 1. Motivation2. Call graph Construction&#xff08;CHA&#xff09;2.1 方法分派Method Dispatch2.2 方法签名method signature2.3 案例&#xff1a;查找Dispatch2.4 CHA2.5 通过CHA构造调用图 3. Interprocedural Control-Flow Graph4. Interprocedural Data-Flow…

Open Book LLM Science Exam

工作太忙&#xff0c;导致完全没有时间学习了。国庆期间&#xff0c;抽空找个baseline继续学习一波 https://www.kaggle.com/code/jjinho/open-book-llm-science-exam/notebook 首先将维基百科数据都保存为faiss index&#xff0c;根据train训练集的prompt选择最相似的3个 t…

matplotlib.show() 阻塞程序怎么解决

matplot.show() 阻塞程序怎么解决 在使用matplotlib的过程中,发现不能像matlab一样同时开几个窗口进行比较,于是查询得知了交互模式,但是放在脚本里运行的适合却总是一闪而过,图像并不停留,遂仔细阅读和理解了一下文档,记下解决办法,问题比较简单,仅供菜鸟参考。 py…

Apache Hudi初探(五)(与flink的结合)--Flink 中hudi clean操作

背景 本文主要是具体说说Flink中的clean操作的实现 杂说闲谈 在flink中主要是CleanFunction函数&#xff1a; Overridepublic void open(Configuration parameters) throws Exception {super.open(parameters);this.writeClient FlinkWriteClients.createWriteClient(conf,…

python实用小代码

一、python实现31省市名称替换 首先定义了一个字典province_dict&#xff0c;其中包含每个省市的无缩写名称与其标准名称之间的映射。然后&#xff0c;我们使用map()函数将每个省市名称从无缩写名称转换为标准名称&#xff0c;并将结果存储在新列省市标准名称中。 province_di…

安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识

安卓机型app的编译与反编译 apk文件的简单说明与解析 -安卓修改apk apk的组成和编译 一 电脑端几种反编译apk工具操作步骤解析 前面几个博文有说明关于反编译apk和apk架构等有些常识.今天对以上做个补充。初学者记住一点。对于一个apk文件使用压缩软件7zip打开可以查看到文件…