当前位置: 首页 > news >正文

【STL】stack

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 适配转换出 stack
	template<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容器适配器)。

相关文章:

  • Java数据结构-栈和队列
  • Open GL ES ->GLSurfaceView+离屏渲染滤镜作用的Bitmap+动态顺序叠加滤镜作用链的RecyclerView
  • 前端Three.js入门(五)
  • 智慧养老线上线下联动:重构多样化养老服务的创新实践
  • 嵌入式软件安全设计指南(V2.0)
  • 前沿科技:从Gen2到Gen3—Kinova轻型机械臂的技术升级路径
  • Transformer预训练模型(如BERT、GPT)的特殊标记
  • 在 UniApp 编译小程序时出现 `:class` 不支持 `getStatusClass(device.deviceStatus)` 语法的报错
  • idea解决properties中文乱码
  • 横扫SQL面试——连续性登录问题
  • Vue2和Vue3响应式的基本实现
  • vue:突然发现onok无法使用
  • 庙算兵棋推演AI开发初探(空想篇-RLHF尝试)
  • leetcode148.排序链表
  • NestJS——创建项目、编写User模块
  • 谷歌浏览器安装Vue开发者工具指南
  • 网络安全中的“后门”:概念、类型、作用与攻防技术
  • 横扫SQL面试——用户留存率问题
  • 【信奥一本通提高篇】基础算法之贪心算法
  • 程序自动化填写网页表单数据
  • 日本的广告网站/西安官网seo技术
  • 网站优化外包/中央新闻直播今天
  • 一般在百度做网站多少钱/搜索引擎有哪些好用
  • 忻州网站建设公司/售卖链接
  • 和县网站建设/网上打广告有哪些软件
  • wordpress 去谷歌/seo快速排名外包