2021-9-28 数据结构学习 第四章 - 栈 和 队列【1024Re】
新学期被作业淹没,将博客晾在这太久了,不禁心生惭愧,于是将今晚本来计划去深圳湾公园散步的时间用来写文章。我在想,要写什么呢,看着案上的数据结构,就决定是你了!
看名字是第四章,我是不是错过了什么,其实是正在学栈和队列,剩下的三章会在国庆尽力填坑。
假设大家学过线性表,那么栈和队列就是特殊的线性表罢了。我上一次接触栈,是在汇编语言的学习处,是比较硬件的理解,现在学习数据结构,就是从软件、实用的角度来理解栈。
上图是栈的模型,栈是允许在同一端进行插入和删除操作的线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。我们已经在汇编中知晓push和pop,压入push是增加数据,而弹出pop是删除数据 ,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作 ,但读取栈中的数据是随便的没有接口约束之说。很多人都误解这个理念从而对栈产生困惑。
如果你不能理解栈的模型,那想象一下手枪压膛,先压入的子弹总是最后射出,这就是栈的原理。
考你一个问题:设将整数1、2、3、4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请问一个可以输出多少种结果?
答案是十四种,你可以写出来吗?
ok,我们来康康栈的定义(code)
前面说过,栈本质上是顺序表,那么我们可以用顺序表(链表来实现)但是C++有STL栈容器——stack,极大的方便了我们(相当于人家帮你定义好了)
stack堆栈容器的C++标准头文件为 stack ,必须用宏语句 "#include <stack>" 包含进来,才可对 stack 堆栈的程序进行编译。
下面是基本使用方法:
堆栈初始化:
1. stack()
默认构造函数,创建一个空的 stack 对象。
例如,下面一行创建一个空的堆栈对象 s 。
stack<int> s;元素入栈
stack堆栈容器的元素入栈函数为 push 函数。由于 C++ STL 的堆栈函数是不预设大小的,因此,入栈函数就不考虑堆栈空间是否为满,均将元素压入堆栈,从而函数没有标明入栈成功与否的返回值。
如下是他的使用原型:
void push(const value_type& x)
元素出栈
stack容器的元素出栈函数为 pop 函数,由于函数并没有判断堆栈是否为空,才进行元素的弹出,因此,需要自行判断堆栈是否为空,才可执行 pop 函数。
void pop()
下面的示例代码,将堆栈的所有元素全部出栈
// stack<int> s;
while(!s.empty())
{
s.pop();// 出栈
}
取栈顶元素
stack容器的栈顶元素的读取函数为 pop 函数,将取出最后入栈的元素,如下是它的使用原型
value_type& top()堆栈非空判断
随着堆栈元素不断出栈,堆栈可能会出现空的情况,因此,一般需要调用 empty 函数判断是否非空,才作元素出栈和取栈顶元素的操作。
bool empty(). 布尔型,返回0或1;
判断堆栈是否为空,返回 true 表示堆栈已空,false 表示堆栈非空。感谢:以上内容改自CSDN博主 lyj2014211626 的c++ stl栈容器stack用法介绍 好文:
c++ stl栈容器stack用法介绍
下面是对每个函数的用法:
//----------------------------------------- 读取堆栈的栈顶元素
#include <stack>
#include <iostream>
using namespace std;
int main()
{// 创建堆栈对象stack<int> s;// 元素入栈s.push(1);s.push(2);s.push(3);s.push(4);s.push(5);s.push(6);// 元素依次出栈while(!s.empty()){// 打印栈顶元素cout << s.top() << endl;// 出栈s.pop();}return 0;
}
//检查栈的大小是否可容纳压入元素
#include <stack>
#include <list>
#include <iostream>
#define STACK_SIZE 100 // 堆栈最大容量
using namespace std;
int main()
{// 用双向链表作堆栈的底层结构stack<int, list<int> > s; // 堆栈未满,元素才能入栈if (s.size() < STACK_SIZE)s.push(68);if (s.size() < STACK_SIZE)s.push(1);if (s.size() < STACK_SIZE)s.push(17);// 元素出栈while (!s.empty()){// 打印 17 1 68cout << s.top() << endl;s.pop();}return 0;
}
感谢:以上内容改自CSDN博主 lyj2014211626 的c++ stl栈容器stack用法介绍 好文:
c++ stl栈容器stack用法介绍
2021-9-28 数据结构学习 第四章 - 栈 和 队列【1024Re】相关推荐
- 2022天勤考研数据结构笔记 第3章 栈和队列
2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...
- Java数据结构与算法(第四章栈和队列)
2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构( ...
- 【算法基础】数据结构导论第三章-栈、队列和数组.pptx
上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 本文参考百度文库的多篇文章. 如需下载ppt文件,请回复"sjjg3" ...
- 【数据结构】第三章 栈和队列
1 栈的概念 栈:限定仅在表尾进行插入和删除操作的线性表,后进先出的线性表,简称LIFO结构 栈顶:表尾,允许插入和删除的一端 栈底:表头,不允许插入和删除的一端 空栈:不含任何数据元素的栈 2 栈的 ...
- 数据结构系列(四)栈与队列
栈 定义 栈是一种特殊的线性表 操作 存储结构 从存储结构来看,分为顺序栈和链栈,同线性表的划分 应用 递归-菲波那切数列 后缀表达式-逆波兰表示 队列 定义 队列也是一种特殊的线性表 操作 队列 ...
- 数据结构应用题第三章栈和队列代码c
若希望循环队列中的元素都得到利用,则需要设置一个标志域tag,并且以tag的值为0或1来区分队头指针front和队尾指针rear相同的队列状态是"空"还是"满" ...
- 【算法基础】数据结构导论第四章-树.pptx
上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 数据结构导论第三章-栈.队列和数组 本文参考百度文库的多篇文章. 如需下载ppt文件,请在本 ...
- 《数据结构》第四章串,数组和广义表
<数据结构>第四章 文章目录 <数据结构>第四章 4.1 串的定义 4.2 案例引入 4.3 串的类型定义,存储结构及其运算 4.3.1 串的抽象类型定义 4.3.2的存储结构 ...
- STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用
STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用 本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6. 文章目录 STM32固件库(标准外设库)入门学习 第 ...
最新文章
- Verilog中Dump函数及用法
- 从任何兼容 TWAIN 的设备获取图象的控件Dynamic Web TWAIN
- Oracle的resouce、unlimited tablespace 及如何把数据导入不同的表空间
- 普通人为什么要学习Python
- java封装对象数组_java解析JSON对象和封装对象的示例
- 用Python看蜜雪冰城店铺在哪个省份最多~
- 实现机器学习的循序渐进指南VI——AdaBoost
- Visio绘制ER图-
- CorelDRAWX4的VBA插件开发(三)VBA的必用基础知识
- php 打印去掉页眉页脚,window.print打印 去掉页眉页脚及打印链接
- 桌面虚拟化:软件为先
- 联想拯救者Y9000P唤醒修复
- pycharm typo
- 一个月刷完机器学习笔试题300题(10)
- AARRR模型的使用注意事项【防坑提醒】
- 搭建论坛discuz
- 人在四合院:我变成了何雨柱(二)
- [Azure DevOps] 如何安装并配置 Build Agent
- 特征工程(七):图像特征提取和深度学习
- 推荐官方开源 PInvoke 库 包含大量 win32 封装