Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++(STL):25 ---序列式容器stack源码剖析

C++(STL):25 ---序列式容器stack源码剖析

作者头像
用户3479834
发布于 2021-02-03 06:45:56
发布于 2021-02-03 06:45:56
61400
代码可运行
举报
文章被收录于专栏:游戏开发司机游戏开发司机
运行总次数:0
代码可运行

一、stack概述

  • stack是一种先进后出(First In Last Out,FILO)的数据结构。它只有一个出口, 形式如下图所示
  • 特点:
    • stack允许新增元素、移除元素、取得最顶端元素。但除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之stack不允许有遍历行为
    • 将元素推入stack的动作称为push,将元素推出stack的动作称为pop
  • 底层实现:
    • SGI STL默认以deque作为缺省情况下的stack底部结构(因为deque是双向开口的数据结构,所以只要封闭其头端开口既可以形式一个stack)
  • stack是一种配接器(Adapter):由于stack系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,称为adapter(配接器),因此 STL stack往往不被归类为container(容器),而被归类为container adapter

二、stack的源码

  • 下面是stack的源码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class _Tp,
class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(deque<_Tp>) > //默认以deque实现
class stack;


template <class _Tp, class _Sequence>
class stack {


// requirements:


__STL_CLASS_REQUIRES(_Tp, _Assignable);
__STL_CLASS_REQUIRES(_Sequence, _BackInsertionSequence);
typedef typename _Sequence::value_type _Sequence_value_type;
__STL_CLASS_REQUIRES_SAME_TYPE(_Tp, _Sequence_value_type);




#ifdef __STL_MEMBER_TEMPLATES
template <class _Tp1, class _Seq1>
friend bool operator== (const stack<_Tp1, _Seq1>&,
const stack<_Tp1, _Seq1>&);
template <class _Tp1, class _Seq1>
friend bool operator< (const stack<_Tp1, _Seq1>&,
const stack<_Tp1, _Seq1>&);
#else /* __STL_MEMBER_TEMPLATES */
friend bool __STD_QUALIFIER
operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&);
friend bool __STD_QUALIFIER
operator< __STL_NULL_TMPL_ARGS (const stack&, const stack&);
#endif /* __STL_MEMBER_TEMPLATES */

public:
typedef typename _Sequence::value_type      value_type;
typedef typename _Sequence::size_type       size_type;
typedef          _Sequence                  container_type;

typedef typename _Sequence::reference       reference;
typedef typename _Sequence::const_reference const_reference;
protected:
_Sequence c;  //底层容器
public:
stack() : c() {}
explicit stack(const _Sequence& __s) : c(__s) {}

//以下为c的操作
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
reference top() { return c.back(); }
const_reference top() const { return c.back(); }
void push(const value_type& __x) { c.push_back(__x); }
void pop() { c.pop_back(); }
};
  • 以下是stack源码中的一些运算符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class _Tp, class _Seq>
bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return __x.c == __y.c;
}


template <class _Tp, class _Seq>
bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return __x.c < __y.c;
}

#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER

template <class _Tp, class _Seq>
bool operator!=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return !(__x == __y);
}

template <class _Tp, class _Seq>
bool operator>(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return __y < __x;
}

template <class _Tp, class _Seq>
bool operator<=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return !(__y < __x);
}

template <class _Tp, class _Seq>
bool operator>=(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return !(__x < __y);
}

三、stack没有迭代器

  • stack所有元素的进出都必须符合“先进后出”的条件,只有stack顶端的元素, 才有机会被外界取用。stack不提供走访功能,也不提供迭代器

四、演示案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <list>
#include <stack>


using namespace std;


int main()
{
std::stack<int,std::list<int>> st;
st.push(1);
st.push(3);
st.push(5);
st.push(7);


std::cout << st.size() << std::endl;
std::cout << st.top() << std::endl << std::endl;


st.pop();
std::cout << st.top() << std::endl;
st.pop();
std::cout << st.top() << std::endl;
st.pop();
std::cout << st.top() << std::endl;


return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++(STL):23 ---序列式容器queue源码剖析
一、queue概述 queue是一种先进先出(First In First Out,FIFO)的数据结构。它有两个出口,形式如下图所示 特点: queue允许新增元素、移除元素、从最底端加入元素、取得
用户3479834
2021/02/03
1.2K0
C++(STL):23 ---序列式容器queue源码剖析
结合源码浅谈栈和队列
栈和队列是我们日常使用频率非常高的数据结构,广泛应用在各种问题和场景当中。并且它们的原理相对来说比较简单,并且有一定的相似之处,所以合并到一起来介绍。
TechFlow-承志
2023/03/02
4300
结合源码浅谈栈和队列
​C++ STL源码剖析之容器配接器stack与queue、priority_queue
对于stack来说,底层容器可以是vector、deque、list,但不可以是map、set。由于编译器不会做全面性检查,当调用函数不存在的时候,就编译不通过,所以对于像set虽然不能作为底层容器,但如果具有某些函数,调用仍然是成功的,直到调用的函数不存在。
公众号guangcity
2019/10/20
1.1K0
C++(STL):31 ---关联式容器map源码剖析
map的特性 所有元素都会根据元素的键值自动被排序 map中的pair结构 map的所有元素类型都是pair,同时拥有实值(value)和键值(key) pair的第一个元素视为键值,第二个元素视为实值 map不允许两个元素拥有相同的键值 下面是stl_pair.h中pair的定义: //代码摘录与stl_pair.h template <class _T1, class _T2> struct pair { typedef _T1 first_type; typedef _T2 second_type;
用户3479834
2021/02/03
1.7K0
C++(STL):31 ---关联式容器map源码剖析
C++在stack的deque实现
在本例中,我加入了几项功能,包含不同类型stack之间的复制和赋值功能,能够实现诸如Stack<int, vector<int> >和Stack<double, list<double> >之间的复制和赋值,这主要依靠成员函数模板来实现。
全栈程序员站长
2022/07/05
4040
C++(STL):36---关联式容器multiset、multimap源码剖析
一、multiset multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层RB-tree的insert_equal()而非insert_unique() multiset源码 //以下代码摘录于stl_multiset.h template <class _Key, class _Compare, class _Alloc> class multiset { // requirements: __STL_CLASS_REQUIRES(_Key,
用户3479834
2021/02/03
6460
C++(STL):27 ---关联式容器set源码剖析
一、set set语法使用参阅: set的特性 set所有元素都会根据元素的键值自动被排序 set中的键值就是实值,实值就是键值 默认情况下set不允许两个元素重复 set的迭代器 不能根据set的迭代器改变set元素的值。因为其键值就是实值,实值就是键值,如果改变set元素值,会严重破坏set组织 在后面的源码中会看到,set的迭代器set<T>::iterator被定义为底层RB-tree的const_iterator。因此set的迭代器是一种constant iterators set拥有与lis
用户3479834
2021/02/03
7650
C++(STL):33---hash_set、hash_map、hash_multiset、hash_multimap源码剖析
这些关联容器底层都是使用hash table实现的. 一、hash_set 由于hash_set底层是以hash table实现的,因此hash_set只是简单的调用hash table的方法即可 与set的异同点: hash_set与set都是用来快速查找元素的 但是set会对元素自动排序,而hash_set没有 hash_set和set的使用方法相同 在介绍hash table的hash functions的时候说过,hash table有一些无法处理的类型(除非用户自己书写hash function
用户3479834
2021/02/03
2.2K0
C++(STL):33---hash_set、hash_map、hash_multiset、hash_multimap源码剖析
【深入探索 C++ STL 容器适配器 stack 和 queue】 —— 数据战场的神秘指挥官,掌控代码节奏的幕后黑手
C++ STL系列学习参考:STL 数据结构与算法__Zwy@的博客-CSDN博客
换一颗红豆
2024/12/20
1110
【深入探索 C++ STL 容器适配器 stack 和 queue】 —— 数据战场的神秘指挥官,掌控代码节奏的幕后黑手
STL 总结与常见面试题
为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。
C语言与CPP编程
2020/10/16
9370
C++ STL源码剖析之双向环形链表list
双向环状链表从节点值为3开始插入,红色框表示最后一个节点(end()指向的节点)。黄色线条表示指向前驱节点,黑色线条表示指向后继节点。
公众号guangcity
2019/10/09
1.7K0
【c++】stack和queue使用 && stack和queue模拟实现
stack的文档介绍:https://cplusplus.com/reference/stack/stack/?kw=stack
用户10925563
2024/06/04
1410
【c++】stack和queue使用 && stack和queue模拟实现
从零开始学C++之STL(十一):容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例
该文章讨论了技术社区中的代码评审和代码质量,强调了代码规范、注释、命名惯例和模块化代码组织的重要性。作者还介绍了静态代码分析工具、单元测试和持续集成,并讨论了代码评审和测试驱动开发(TDD)的实践。此外,文章还探讨了代码可维护性和可扩展性,并介绍了使用设计模式进行代码复用和模块化编程。
s1mba
2017/12/28
9020
从零开始学C++之STL(十一):容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例
C++第十三弹 -- STL之stack深度剖析与模拟实现
在现代C++编程中,STL(标准模板库)是一个不可或缺的工具。它提供了一套通用的模板类和算法,使得开发者能够更加高效地处理数据。本文将重点介绍STL中的stack容器,作为一种重要的顺序容器,stack遵循后进先出(LIFO,Last In First Out)的特性,广泛应用于函数调用、表达式求值等场景。通过深入了解stack的特性、基本操作及应用实例,读者将能够更好地掌握和应用这一重要的数据结构。
用户11317877
2024/10/16
1350
C++第十三弹 -- STL之stack深度剖析与模拟实现
【C++】STL——容器适配器 stack和queue 深度剖析及模拟实现 & 适配器模式的了解
🆗,那我们看到它的成员函数其实除了emplace其它的我们都是比较熟悉的。 另外,大家可能注意到,stack是不是没有迭代器啊,而我们之前学的string、vector、list都有啊,为什么呢?
YIN_尹
2024/01/23
9350
C++效率掌握之STL库:stack && queue函数全解
本篇是 STL 库专题之 stack 和 queue,本质就是栈和队列,关于该数据结构在初阶数据结构专栏里有详细的解释分析,本篇文章主要针对 stack 和 queue 的使用及拓展进行练习和介绍,建议熟悉好相关的数据结构知识再进行本篇学习
DARLING Zero two
2025/03/25
1250
C++效率掌握之STL库:stack && queue函数全解
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque。
秦jh
2024/06/12
2490
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
C++(STL):24 ---序列式容器stack用法
1.stack的定义 要使用stack,应先添加头文件#include <stack>, 并在头文件下面加上"using namespace std"//定义 stack< typename > name; 2. stack容器内元素的访问 由于栈(stack)本书就是一种后进先出的数据结构,在STL的stack中只能通过top()来访问栈顶元素. #include <stdio.h> #include <stack> using namespace std; int main() { stack<
用户3479834
2021/02/03
4910
【C++】STL--stack
后进先出(LIFO):Stack容器遵循后进先出的原则,即最后进入栈的元素最先被移出栈。
用户11375356
2024/11/22
820
【C++】STL--stack
【C++】详解 stack && queue && priority_queue && deque
​ 通过观察文档我们不难发现,接口相较于之前的 string、vector 和 list 少了很多。它甚至连拷贝构造和析构都没有自己实现,然而这些都得益于容器适配器的使用。
利刃大大
2025/02/12
1000
【C++】详解 stack && queue && priority_queue && deque
推荐阅读
相关推荐
C++(STL):23 ---序列式容器queue源码剖析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验