目录

栈的底层实现原理

1. stack定义和初始化

2.stack的赋值

3. stack进栈和出栈

4. stack判空和大小

5. 注意事项(附加)

欢迎关注微信公众号 “三贝勒文子” ,每天学习C++


学过数据结构的小伙伴都知道栈(stack),它是一种存放数据的结构体,以往我们在学习编程的时候都会自己去实现一个栈,今天,小编告诉你C++的STL给我们提供了stack容器,这个容器就是栈。

栈的特性就是先进后出,而且只有一个开口,只能在一端进行数据的插入和删除操作。如下图所示:

栈的底层实现原理

在STL中,栈的底层实现原理默认是双端队列deque,但是你也可以通过vector或者list去实现stack。

如果你要使用stack容器,那么需要添加头文件

# include<stack>

1. stack定义和初始化

  • 默认构造函数:

  • 拷贝构造函数:

// stack<T> stkT;//stack采用模板类实现, stack对象的默认构造形式:
// stack(const stack &stk);//拷贝构造函数
​
stack<int> serven_stk1;          // 空栈,默认构造函数
stack<int> serven_stk2(serven_stk1);  // 拷贝构造函数

2.stack的赋值

operator=:重写operator=操作符。

// stack& operator=(const stack &stk);//重载等号操作符
​
/* stack的赋值操作 */
serven_stk1.push(1);
serven_stk1.push(2);
​
serven_stk2 = serven_stk1;        // 将栈serven_stk1拷贝给栈serven_stk2
​
cout<<"栈serven_stk1的出栈顺序为:";
Print_Stack(serven_stk1);
​
​
cout<<"栈serven_stk2的出栈顺序为:";
Print_Stack(serven_stk2);
cout<<endl;

运行结果:

3. stack进栈和出栈

  • push(val):元素入栈

  • pop():元素出栈

  • top():获取栈顶元素

// push(elem);//向栈顶添加元素
// pop();//从栈顶移除第一个元素
// top();//返回栈顶元素
​
​
/* stack的进栈和出栈操作 */
serven_stk1.push(5);    // 进栈
serven_stk1.push(4);    // 进栈
serven_stk1.push(3);    // 进栈
cout<<"出栈前serven_stk1的长度:"<<serven_stk1.size()<<endl;
serven_stk1.pop();      // 出栈
cout<<"出栈后serven_stk1的长度:"<<serven_stk1.size()<<endl;
​
cout<<"栈serven_stk1的栈顶元素为:"<<serven_stk1.top()<<endl;
cout<<"栈serven_stk1的长度:"<<serven_stk1.size()<<endl<<endl;

运行结果:

4. stack判空和大小

empty():

size():

// empty();//判断堆栈是否为空
// size();//返回堆栈的大小
​
/* stack判空 */
cout<<"栈serven_stk1是否为空栈:"<<serven_stk1.empty()<<endl;
cout<<"栈serven_stk1的长度:"<<serven_stk1.size()<<endl;

运行结果:

5. 注意事项(附加)

在上面的打印栈元素的函数Print_stack中,参数的传递有三种,值传递、引用传递和指针传递,在这里就想告诉你只有值传递打印栈,执行pop()后,实参的栈里面的元素都还在。引用传递和指针传递在函数里面执行pop()后实参的栈的元素就都不见了。

/*  参数传递*/
cout<<"栈serven_stk2的出栈顺序为:";
Print_Stack(serven_stk2);
cout<<"栈serven_stk2的长度:"<<serven_stk2.size()<<endl;
​
cout<<"栈serven_stk2的出栈顺序为:";
Print_StackRef(serven_stk2);
cout<<"栈serven_stk2的长度:"<<serven_stk2.size()<<endl;/* 值传递函数 */
void Print_Stack(stack<int> ser){while(!ser.empty()){cout<<ser.top()<<" ";ser.pop();}cout<<endl;
}/* 引用传递函数 */
void Print_StackRef(stack<int>& ser){while(!ser.empty()){cout<<ser.top()<<" ";ser.pop();}cout<<endl;
}

运行结果:

可以看到引用传递的结果就是,栈的大小变成0了,而值传递就还是2。 这个跟本章节的栈没多大关系,只是小编在这里告诉你一下,值传递和引用传递的区别和效果。

既然说到这里了,就再说一下吧。在我们调用函数的时候,编译器会给函数里面的形参申请内存空间,然后将实参的数据拷贝一份放置到形参的内存空间中。

值传递:

引用传递:

这两张图很明显了吧~~

欢迎关注微信公众号 “三贝勒文子” ,每天学习C++

STL之容器stack相关推荐

  1. c++ stl栈容器stack用法介绍

    stack堆栈容器 堆栈是一个线性表,插入和删除只在表的一端进行.这一端称为栈顶(Stack Top),另一端则为栈底(Stack Bottom).堆栈的元素插入称为入栈,元素的删除称为出栈.由于元素 ...

  2. cqueue结构pop_c++ stl栈容器stack的pop(),push()等用法介绍及头文件

    C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,--也就是说实现了一个先进后出(FILO)的数据结构. c++ stl栈stack的头文件为: #include c++ ...

  3. 【C++】 STL库的stack容器

    STL库的stack容器 1.构造函数 2.增 2.1 push() 2.2 emplace() 两者区别 3.删 pop() 4.改 4.1 swap()交换 5.查 top() 6.判空 empt ...

  4. 容器删除元素后迭代器失效_STL 4: STL之容器:选择时机,删除元素,迭代器失效...

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...

  5. [C++ STL] 各容器简单介绍

    [C++ STL] 各容器简单介绍 目录 一.什么是STL? 二.容器(Containers) 2.1 vector 2.2 deque 2.3 list 2.4 set 2.5 map 2.6 容器 ...

  6. 极客班C++ STL(容器)第二周笔记

    为什么80%的码农都做不了架构师?>>>    极客班 C++ STL (容器算法)第二周笔记 标签(空格分隔): C++ 1. 容器(下) 1.1 Stack a. 概述 Stac ...

  7. STL 常用容器的底层数据结构

    STL 常用容器的底层数据结构实现 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层数据结构为一个中央控制器和多个缓冲 ...

  8. STL库:stack和queue

    STL库:stack和queue 文章目录 STL库:stack和queue 1.STL库中stack的官方介绍 2.stack的常用接口 3.stack的模拟实现 4.STL库中queue的官方介绍 ...

  9. 【读书笔记】【Effective STL】容器

    第 1 条:慎重选择容器类型. C++ 中不同的容器分类如下:[标准 or 非标准][STL or 非 STL][序列 or 关联] 标准 STL 序列容器:vector.string.deque.l ...

最新文章

  1. 初等数论--整除--判断一个数是否是素数
  2. Error:Unable to capture view hierarchy
  3. C#使用HttpClient进行http操作
  4. spring-data-jpa 使用
  5. 一切为了开放科学!Papers with Code新增CS、物理、数学、统计学等多个学科
  6. [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)
  7. ActiveMQ 认证
  8. OC中的内省方法初探
  9. Linux系统下poll的使用方式
  10. C#之ActionBlock异步关闭死锁
  11. Kubernetes网络策略,这一篇就够了
  12. AS3文本框的操作,为密码框添加按钮
  13. 如何写前端技术方案文档?
  14. 1+x云计算平台运维与开发初级
  15. matplotlib-27 内嵌环形饼图
  16. self和parent的用法
  17. 03Java常用API-16. 日期Date类型及其常用方法
  18. oracle asm 缺省用户,oracle asm自动存储使用及管理说明(下)
  19. 苹果应用商店审核指南
  20. 离职了半年了,大家觉得我为啥离职呢?

热门文章

  1. pdcch加扰_一种基站/终端及其PDCCH加扰/解扰的方法和装置_2014104470078_权利要求书_专利查询_专利网_钻瓜专利网...
  2. Laravel使用swagger PHP生成api接口文档
  3. 【java】-XX:-OmitStackTraceInFastThrow只有空指针,没有堆栈信息
  4. 2022-01-27 使用liquibase管理mysql执行版本
  5. Android开机画面定制
  6. xpath 准确匹配 跟 模糊匹配属性
  7. Html和Markdown中的空格, nbsp; ensp; emsp; 以及 thinsp; zwnj; zwj;三种Unicode空格
  8. 基于GitHub搭建个人网站
  9. 设置鼠标右键文件夹打开idea
  10. MySQL数据恢复(通过.frm和.idb文件)