王道408数据结构——第三章 栈和队列
一、栈
栈(Stack)是只允许在一端进行插入或删除操作的线性表。
栈顶:线性表允许插入删除的那一端
栈底:固定的、不允许进行插入删除的另一端
栈的操作特性可以概括为后进先出(LIFO)
n个不同的元素进栈,出栈元素不同的排列个数为C2nnn+1=1n!(2n)!n!1n+1=(2n)!n!(n+1)!\frac{C^n_{2n}}{n+1}=\frac{1}{n!}\frac{(2n)!}{n!}\frac{1}{n+1}=\frac{(2n)!}{n!(n+1)!}n+1C2nn=n!1n!(2n)!n+11=n!(n+1)!(2n)!(卡特兰数)
顺序栈
采用顺序存储的栈称为顺序栈,利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。
共享栈
利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。
链栈
采用链式存储的栈称为链栈,优点是便于多个栈共享存储空间和提升效率,不存在栈满上溢的情况。通常采用单链表实现,规定所有操作在表头进行。
二、队列
队列(Queue)只允许在表的一段进行插入,而在表的另一端进行删除。
队头(Front):允许删除的一端。
队尾(Rear):允许插入的一端。
其特性概括为先进先出(FIFO)
队列的顺序储存
分配一块连续的存储单元存放队列中的元素,并设队头指针front(指向队头元素)和队尾指针rear(指向队尾元素下一个位置)
循环队列
将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列,当队首指针Q.front = MAXSIZE - 1后,再前进一个位置就自动到0,可以利用取余运算。
队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个指针。
初始时:Q.front = Q.rear = 0
队首指针进一(出队):Q.front = (Q.front + 1) % MAXSIZE
队尾指针进一(入队):Q.rear = (Q.rear + 1) % MAXSIZE
队列长度:(Q.rear + MAXSIZE - Q.front) % MAXSIZE
队空:Q.front == Q.fear
队满:(Q.rear + 1) % MAXSIZE == Q.front
队列的链式存储
队列的链式表示称为链队列,实际上是一个同时带有队头指针和队尾指针的单链表。
用单链表表示的链式队列特别适合于数据元素变动较大的情形,而且不存在队列满产生溢出的问题。
双端队列
指允许两端都进行入队出队操作的队列,其元素的逻辑结构仍是线性结构。
- 输出受限的双端队列:允许在一端进行插入和删除,但在另一端只允许插入的双端队列。
- 输入受限的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列
三、队列和栈的应用
括号匹配
算法如下
初始设置一个空栈,顺序读入括号:
- 若是左括号,将其压入栈中;
- 若是右括号,则将其与栈顶的括号进行匹配:
- 若栈顶是类型相同的左括号,使其出栈
- 若栈顶括号类型不匹配,则匹配不成功,退出程序
当括号序列读取完毕时,若栈空,则匹配成功,否则匹配不成功。
表达式求值
后缀表达式(逆波兰表达式)
后缀表达式的运算符在操作数的后面,在后缀表达式中已考虑了算符的优先级。后缀表达式只有操作数和算符,无需括号。
后缀表达式与表达式树的后序遍历序列相同。
算法如下
初始设置一个空栈,顺序读入后缀表达式的每一项,根据其类型决定操作:
- 若为操作数:将其压入栈中
- 若为运算符<op>:连续从栈中弹出两个操作数Y、X,进行X<op>Y运算,并将结果压入栈中
当表达式的所有项都处理完后,栈顶存放的就是最后的计算结果。
栈在递归中的应用
将递归算法转换为非递归算法,需要借助栈实现。
但对于单项递归和尾递归,可以用迭代的方式消除递归。
尾递归:程序中只有一句递归语句,且在末尾。
单向递归:指程序中的递归语句,在本程序操作执行前,都已经完成,如斐波那契数列。
这样一来,它们共同的特点是在化非递归时都没有非要保存的分支路线
队列在层次遍历中的应用
使用队列保存下一步的处理顺序。
王道408数据结构——第三章 栈和队列相关推荐
- 王道考研408 数据结构 第三章 栈、队列与数组
第三章 栈.队列与数组 3.1 栈 3.1.03 假设以I和O分别表示入栈和出栈操作.栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序 ...
- (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)
前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...
- 数据结构-第三章-栈和队列(5)-链队
数据结构 ⚡️数据结构-第一章 ⚡️抽象数据类型案例 ⚡️数据结构-第二章(1)-线性结构 ⚡️数据结构-第二章(2)-线性表的顺序表示和实现 ⚡️数据结构-第二章(3)-顺序表(含代码) ⚡️数据结 ...
- C语言数据结构-第三章栈和队列-电大同步进度
第三章栈和队列简介 从数据结构角度看,栈和队列是两种重要的线性结构,是一类操作受限制的特殊线性表,其特殊性在于限制插入和删除等运算的位置. 堆栈,限制用户只能在指定的一端插入和删除元素,因此具有后进先 ...
- (王道408考研数据结构)第三章栈和队列-第五节:Java、C++、Python实现栈和队列
专栏目录首页:[专栏必读]王道考研408数据结构+计算机算法设计与分析万字笔记.题目题型总结.注意事项.目录导航和思维导图 文章目录 一:栈的实现 (1)C语言实现 (2)C++实现 (3)Java实 ...
- (王道408考研数据结构)第三章栈和队列-第一节:栈基本概念、顺序栈和链栈基本操作
文章目录 一:栈基本概念 (1)栈的定义 (2)压栈和出栈 (3)进栈出栈变化形式 (4)栈的操作 二:栈的顺序存储结构及其操作实现 (1)顺序栈的定义 (2)进栈 (3)出栈 (4)读取栈顶元素 ( ...
- 王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!! 关于对 栈和队列 章节知识点总结的十分全面,涵括了<王道数 ...
- 数据结构——第三章 栈和队列
一.单选题(共18题,55分) 1.栈结构通常采用的两种存储结构是( ). A. 顺序存储结构和链表存储结构. B. 散列方式和索引方式. C. 链表存储结构和数组. D. 线性链表结构和非线性 ...
- (王道408考研数据结构)第三章栈和队列-第三节2:栈的应用之递归
栈和递归是息息相关的,所谓递归其核心思想就是将一个问题划分为子问题解决,然后再把子问题划分为更小的问题,直至划分到不能再划分为止,因此构成递归的条件有 可以把待解决的问题转化为一个新问题,而这个新的问 ...
最新文章
- 把大脑「复制-粘贴」到芯片上,三星、哈佛的大胆设想登上Nature子刊
- 汪劲:生命系统中的非平衡物理学
- linux ldconfig 与 /etc/ld.so.conf 动态函数库配置
- 【Kotlin】循环控制流 ( for 循环 | Iterator 遍历形式 | Iterator 遍历要求 | IntArray 源码解析 )
- Ubuntu 16.04安装Java JDK
- ALV字段编辑时,输入长度受限制解决方法
- HDU计算机网络系统2021复习提纲
- 牛客 2021年度训练联盟热身训练赛第二场 A题
- 安装linux-mysql-yum方式
- log添加 oracle redo_Oracle更改redo log大小 or 增加redo log组
- 《概率论与数理统计》(浙大第四版)第四章总结笔记(纯手写)
- 台式计算机如何组装,怎样组装基本台式机
- ln命令 Linux软连接(Symbolic Link)和硬链接(Hard Link)
- 企业市场推广之网络营销运营策略探讨
- 如何使用ABP开发一
- jdbc连接mysql数据库,设置字符集编码
- mybatis-plus,sgg,杨bochao
- model vs shema vs instance vs store engine
- 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,51单片机C语言和汇编控制28BYJ48步进电机程序...
- 后台管理系统中的antd vue中的问题(动态加载列表a-select-option,后台管理中a-selct-option的回显)
热门文章
- 推荐一款.NET Core开源爬虫神器:DotnetSpider
- 架构思维其实就那么回事
- 程序员羽化之路--假如需要一百万个对象
- Azure DevOps Server CI - 自搭跨平台容器代理Agents
- 为什么需要动态SQL
- 北京Dotnet分享会 || 精英论坛第三期
- .NET Core WebApi中实现多态数据绑定
- 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它
- C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
- RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World