【C++STL精讲】stack与queue的基本使用及模拟实现

news/2025/3/15 3:31:31/

在这里插入图片描述

文章目录

  • 💐专栏导读
  • 💐文章导读
  • 🌷stack是什么?
  • 🌷stack的基本使用
  • 🌷stack的模拟实现
  • 🌷queue是什么?
  • 🌷queue的基本使用
  • 🌷queue的模拟实现

💐专栏导读

🌸作者简介:花想云,在读本科生一枚,致力于 C/C++、Linux 学习。

🌸本文收录于 C++系列,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新!

🌸相关专栏推荐:C语言初阶系列C语言进阶系列数据结构与算法

💐文章导读

本章我们将学习stackqueue的基本使用以及模拟实现。stackqueue同样也是我们最先接触到的STL六大组件之一的容器适配器

在这里插入图片描述

🌷stack是什么?

STL中,stack是一个模板类,用于实现栈数据结构。栈是一种后进先出(LIFO)的数据结构,可以在栈顶进行插入和删除操作。

stack是一种容器适配器,容器适配器不是容器类型本身,而是对现有的容器类型进行了一定程度的封装和改造,从而形成了一种新的容器类型。

stack类封装了一个底层容器,可以使用多种不同的容器作为其底层实现,比如dequevector等。

stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:

  • empty:判空操作;
  • back:获取尾部元素操作;
  • push_back:尾部插入元素操作;
  • pop_back:尾部删除元素操作;

标准容器vectordeque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque

至于deque是什么我们先不深究,我们就当它是vector一样,后面会讲到。

🌷stack的基本使用

  • 🍁使用stack之前需要包含头文件 < stack >
#include <stack>
  • 🍁定义一个栈对象;
	stack<int> s;
  • 🍁将元素压入栈中;
	//push()s.push(1);s.push(2);s.push(3);
  • 🍁访问栈顶元素;
	//top()cout << s.top() << endl;
  • 🍁弹出栈顶元素;
	//pop()s.pop();
  • 🍁获取栈的大小;
	//size()cout << "Size of stack: " << s.size() << endl;
  • 🍁判断栈是否为空;
	//empty()if (s.empty()){cout << "Stack is empty" << endl;}else{cout << "Stack is not empty" << endl;}

🌷stack的模拟实现

我们已经知道栈是一个容器适配器,底层封装了其它容器,所以栈的实现非常简单,在实现各个函数接口时,我们直接复用封装的容器的相关接口即可。

不同于vectorlist的模拟实现,stack需要两个模板参数:

  1. 参数类型
  2. 容器类型

我们可以在自己的命名空间中定义stack类,如下:

namespace hxy
{template<class T, class Container = vector<T>>class stack{public:void push(const T& data){//...}void pop(){//...}const T& top(){//...}size_t size(){//...}bool empty(){//...}private:Container _con;};
}

接下来就是实现各个接口了。作为容器适配器,stack的各接口实现极其简单,用一分钟实现一个栈来描述也不是太夸张,一起来看看吧。

namespace hxy
{template<class T, class Container = vector<T>>class stack{public:void push(const T& data){_con.push_back(data);}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是什么?

queuestack非常相似。在STL中,队列(queue)是一种基本的数据结构,它是一种先进先出(FIFO)的数据结构。队列可以看作是一条通往某个目的地的等待队列,其中最先进入的元素首先被处理,而最后进入的元素则最后被处理。

stack相同,queue同样也是一个容器适配器queuestack对比起来学习会更加轻松。

🌷queue的基本使用

  • 🍁包含头文件< queue >
#include <queue>
  • 🍁定义一个queue对象;
	queue<int> q;
  • 🍁元素入队(队尾添加元素);
	//push()q.push(1);q.push(2);q.push(3);
  • 🍁元素出队(队头删除元素);
	//pop()q.pop()
  • 🍁访问队头元素;
  • 🍁访问队尾元素;
	//front()//back()cout << q.front() << endl;cout << q.back() << endl;
  • 🍁获取队列的大小;
	//size()cout << q.size() << endl;
  • 🍁判断队列是否为空;
	//empty()if (q.empty()){cout << "Queue is empty" << endl;}else{cout << "Queue is not empty" << endl;}

🌷queue的模拟实现

queuestack的实现方式大同小异,此处不做赘述。

namespace hxy
{template<class T, class Container = list<T>>class queue{void push(){_con.push_back();}void pop(){_con.pop_front();}const T& front(){_con.front();}const T& back(){_con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;}

本章节的内容就到这里了。下一章我们将学习双端队列——deque和优先级队列——priority_queue,认识了双端队列,我们就能明白为什么库中的stackqueue要使用deque来做底层容器了。

在这里插入图片描述
点击下方个人名片,可添加博主的个人QQ,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓


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

相关文章

SpringBoot起步依赖和自动配置

文章目录 1、起步依赖2、自动配置 1、起步依赖 概念 起步依赖本质上是一个Maven项目对象模型&#xff08;Project Object Model&#xff0c;POM&#xff09;&#xff0c;定义了对其他库的传递依赖&#xff0c;这些东西加在一起支持某一功能。 简单的说&#xff0c;起步依赖就…

iptables表、链、规则

netfilter/iptables&#xff08;也就是常说的iptables&#xff09;组成Linux平台下的包过滤防火墙&#xff0c;具有完成封包过滤、封包重定向和网络地址转换&#xff08;NAT&#xff09;等功能。 netfilter是Linux 核心中一个通用架构&#xff0c;它提供了一系列的"表&quo…

手敲Mybatis(九)-结果集处理器

1.前言-背景介绍 上节我们处理了参数处理器&#xff0c;本节我们处理结果集处理器&#xff0c;之前我们写了一个DefaultResultSetHandler&#xff0c;我们把返回结果获取对象&#xff0c;填充值什么的写到了一起&#xff0c;流程没有进行解耦&#xff0c;并且只接收了Object的…

信息系统项目管理师-项目范围管理

1.过程 1.1 规划范围管理 为了记录如何定义、确认和控制项目范围及产品范围&#xff0c;而创建范围管理计划的过程。 1.2 收集需求 为实现目标而确定、记录并管理项目干系人的需要和需求的过程。 1.3 定义范围 制定项目和产品详细描述的过程。 1.4 创建WBS&#xff08;工作分解…

数据库备份shell脚本

文章目录 数据库备份shell脚本变量定义FTP 变量定义函数定义主逻辑 数据库备份shell脚本 # var bak_cmd"--userbakup --password123456 --socket/tmp/mysql.sock --no-timestamp" full_dir"/db/full_date %F" incr_dir"/db/incr_date %F" info&…

Kotlin 1.6.0 的新特性

1、稳定版对于枚举、密封类与布尔值主语穷尽 when 语句 一个详尽的when语句包含了所有主题可能的类型或值的分支&#xff0c;或者对于一些类型包含一个else分支。它覆盖了所有可能的情况&#xff0c;使代码更加安全。 即将禁止非详尽的when语句&#xff0c;以使行为与when表达…

多模态之论文笔记ViLT

文章目录 ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision一. 简介1.1 摘要1.2 文本编码器&#xff0c;图像编码器&#xff0c;特征交互复杂度分析1.2 特征交互方式分析1.3 图像特征提取分析 二. 方法 Vision-and-Language Transformer2.1.方…

Docker Desktop使用PostgreSql配合PGAdmin的使用

在看此教程之前&#xff0c;请先下载安装Docker Desktop 安装成功可以查看版本 然后拉取postgresql的镜像&#xff1a;docker pull postgres:14.2 版本可以网上找一个版本&#xff0c;我的不是最新的 发现会报一个问题 no matching manifest for windows/amd64 10.0.19045 i…