【STL】stack

news/2025/4/2 7:15:44/

s t a c k stack stack 是一种容器适配器,设计为先进后出( F i r s t I n L a s t O u t , F I L O First\ In\ Last\ Out,\ FILO First In Last Out, FILO)的数据结构,只有一个出口,将元素推入栈的操作称为 p u s h push push, 将元素推出栈的操作称为 p o p pop pop。因此,只要能满足栈结构要求的容器都可以作为 s t a c k stack stack 的底层容器。同时,由于 s t a c k stack stack 不允许有遍历行为(只能取栈顶元素),因此 s t a c k stack stack 没有迭代器

文章目录

  • 前言 —— 容器适配器
  • 一、stack 的介绍
  • 二、stack 的使用(常用接口)
  • 三、stack 的模拟实现
  • 四、STL 标准库中的 stack
    • 1. 底层结构
    • 2. 模拟实现
  • 总结


前言 —— 容器适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口

在这里插入图片描述


一、stack 的介绍

关于 s t a c k stack stack 的介绍,建议去查 C C C++ 官方文档: s t a c k stack stack 的文档介绍

在这里插入图片描述

以下为 s t a c k stack stack 的官方文档介绍:

  1. 是一种容器适配器,专门设计用于在 L I F O LIFO LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。

  2. 栈作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一组特定的成员函数来访问其元素。元素从特定容器的 “ b a c k ” “back” back 推送 / / /弹出,这称为栈的顶部

  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
    (1)empty:检测栈是否为空。
    (2)size:返回栈中有效元素的个数。
    (3)back:返回栈顶元素的引用。
    (4)push_back:在栈顶压栈。
    (5)pop_back:在栈顶出栈。

  4. 标准容器类 d e q u e deque deque v e c t o r vector vector 满足了这些要求。默认情况下,如果没有为 s t a c k stack stack 实例化指定容器类,则使用标准容器。

在这里插入图片描述


二、stack 的使用(常用接口)

下面只列举了 s t a c k stack stack 最常用的几个接口,更多详细信息可以自行查官方文档: s t a c k stack stack

可以看出 s t a c k stack stack v e c t o r vector vector l i s t list list 都不一样,第二个模板参数从 alloc 变为了 Container,缺省值说明标准库里的 s t a c k stack stack 默认 d e q u e deque deque 容器的容器适配器
t e m p l a t e < c l a s s T , c l a s s C o n t a i n e r = d e q u e < T > > c l a s s s t a c k ; template <class\ T, class\ Container = deque<T> > class\ stack; template<class T,class Container=deque<T>>class stack;

函数说明接口说明
s t a c k ( ) stack() stack()构造空的栈
e m p t y ( ) empty() empty()检测 s t a c k stack stack 是否为空
s i z e ( ) size() size()返回 s t a c k stack stack 中元素的个数
t o p ( ) top() top()返回栈顶元素的引用
p u s h ( ) push() push()将元素 v a l val val 压入 s t a c k stack stack
p o p ( ) pop() pop() s t a c k stack stack 中尾部的元素弹出

三、stack 的模拟实现

栈的接口中可以看出,栈实际是一种特殊的 v e c t o r vector vector,因此使用 v e c t o r vector vector 完全可以模拟实现 s t a c k stack stack

也就是说, s t a c k stack stack 作为容器适配器,是直接封装其他容器的部分功能,只要能实现 s t a c k stack stack 的基本功能,就能够作为 s t a c k stack stack底层实现容器,如: v e c t o r vector vector l i s t list list d e q u e deque deque

这里使用 v e c t o r vector vector 容器为底层默认容器来模拟实现的 s t a c k stack stack

#include<vector>using namespace std;namespace ybc
{//用 Container 适配转换出 stacktemplate<class T, class Container = vector<T>> //给vector缺省值class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;	//底层可以使用 vector/list/deque 容器};
}

注意:类模板实例化时,会按需实例化:使用了哪些成员函数,就实例化哪些成员函数(不会全实例化)。


四、STL 标准库中的 stack

1. 底层结构

虽然 s t a c k stack stack 中也可以存放元素,但在 S T L STL STL 中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为 s t a c k stack stack 只是对其他容器的接口进行了包装 S T L STL STL s t a c k stack stack 默认使用 d e q u e deque deque

在这里插入图片描述

关于 d e q u e deque deque 的介绍可以看我的这篇博客:【STL】 d e q u e deque deque(了解),仅供了解,这里不过多介绍。

2. 模拟实现

#include<vector>
#include<list>
#include<deque>using namespace std;namespace ybc
{//template<class T, class Con = vector<T>>//template<class T, class Con = list<T>>template<class T, class Con = deque<T>>class stack{public:stack() {}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:Con _c;};
}

总结

以某种既有容器为底部结构将其接口改变,使其符合 “ “ 先进后出 ” ” 的特性,形成一个 s t a c k stack stack,是很容易做到的。 d e q u e deque deque 是双向开口的数据结构,若以 d e q u e deque deque 为底部结构并封闭其头端开口,便轻而易举地形成了一个 s t a c k stack stack。因此, S G I SGI SGI S T L STL STL 便以 d e q u e deque deque 作为默认情况下的 s t a c k stack stack 底部结构。

由于 s t a c k stack stack 是以底部容器完成其所有工作,而具有这种 “ “ 修改某物接口,形成另一种风貌 ” ” 的性质的,称为 a d a p t e r adapter adapter适配器),因此, S T L STL STL s t a c k stack stack 往往不被归类为 c o n t a i n e r container container容器),而被归类为 c o n t a i n e r a d a p t e r container\ adapter container adapter容器适配器)。


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

相关文章

微服务架构中的精妙设计:服务注册/服务发现-Eureka

一.使用注册中心背景 1.1服务远程调用问题 服务之间远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺点&#xff1a; 当更换机器, 或者新增机器时, 这个URL就需要跟着变更, 就需要去通知所有的相关服…

STM32H743学习记录

2025/03/30 SRAM速率计算方式 MCU主频 乘以 单片机位数 除以 每个字节的位数&#xff08;8&#xff09;即可得出单片机的SRAM速率 如72M主频32位单片机速率 72 * 32 / 8 288 M/s FLASH速率计算方式 FLASH大小 乘以 单片机位数 除以 每个字节位数&#xff08;8&#xff09…

RK3588使用笔记:设置程序/服务开机自启

一、前言 一般将系统用作嵌入式设备时肯定要布置某些程序&#xff0c;这时候就需要对程序设置开机自己&#xff0c;否则每次都要人为启动&#xff0c;当有些嵌入式系统未连接显示屏或者无桌面环境去操作启动程序时&#xff0c;程序自启就是必须的了&#xff0c;本文介绍在纯li…

简易版“异步多线程服务器”

1.引用 和复制(不用&做参数) 的区别 (1)第一个:肯定是一个原参数操作,另外一个是对原参数 复制一个副本 去操作&#xff08;开销问题&#xff09; (2)第二个:如果是公共参数,比如io_context,他始终只有一个(与内核相关),只能由& 简介 本文基于c,重点是来掌握c的异步概…

python 语法篇(一)

目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数&#xff08;1&#xff09;re.search()--搜索第一个匹配项&#xff08;2&#xff09;re.match() - 从字符串开头匹配&#xff08;3&#xff09;re.findall() - 返回所有匹配项的列表&#xff08;4&#xff09;re.fi…

JAVA实现动态IP黑名单过滤

一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 通过 IP 封禁&#xff0c;可以有效拉黑攻击者&#xff0c;防止资源被滥用&#xff0c;保障合法用户…

实战 | 基于 SpringBoot + UniApp 打造国际版打车系统:架构设计与性能优化全解析

✅ 一、引言&#xff1a;国际版打车系统的技术挑战 随着共享出行在全球范围内的快速发展&#xff0c;跨国打车平台如 Uber、Lyft 和 DiDi 等纷纷崛起。开发一套国际版打车系统&#xff0c;不仅要满足国内需求&#xff0c;还需要应对以下技术挑战&#xff1a; &#x1f30d; 多…

Altium Designer 24 PCB编辑器[设计]栏找不到[规则]选项而只有[Constraints Manager]选项

Altium Designer 24 PCB编辑器[设计]栏找不到[规则]选项而只有[Constraints Manager]选项 问题描述问题原因解决方法 问题描述 在使用 Altium Designer 24 的PCB编辑器时&#xff0c;发现有的PCB文件的【设计】栏下有【规则】这个选项&#xff0c;有的PCB文件的【设计】栏下没…