- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3栈和队列讲义
第三章 栈和队列(数据结构与算法) 第三章 栈和队列 3.1 栈 3.1.1 栈的基本概念 3.1.2 顺序栈 3.1.3 链式栈 3.2 队列 3.2.1 队列的基本概念 3.2.2 链队列 3.2.3 循环队列——队列的顺序存储结构 3.2.4 队列应用 3.3 实例研究——表达式求值 栈和队列都是线性表。 基本操作是线性表操作的子集,是操作受限的线性表。所以可以称为限定性的数据结构。 从数据类型的角度看,他们各自有不同的操作方法,也可以认为是两种不同的抽象数据类型。 3.1.1 栈的基本概念 定义:栈(Stack)是限制在一端进行插入和删除运算的线性表。 通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。假设栈S=(a1,a2,a3,…an),则a1称为栈底元素,an为栈顶元素。栈中元素按a1,a2,a3,…an的次序进栈,退栈的第一个元素应为栈顶元素。 ADT Stack 数据对象: 可以是任意类型的数据,但必须属于同一个数据对象。 数据关系: 栈中数据元素之间是线性关系。 基本操作: (1)int Length() const 初始条件:栈已存在。操作结果:返回栈元素个数。(2)bool Empty() const初始条件:栈已存在。操作结果:如栈为空,则返回true,否则返回false(3)void Clear()初始条件:栈已存在。操作结果:清空栈。 3.1.1 栈的基本概念 栈最主要特点:栈的修改按后进先出的原则进行。栈又称为后进先出线性表。 栈的基本操作:栈的初始化、判空、取栈顶元素、在栈顶进行插入或删除。 插入元素的操作为入栈;删除栈顶元素的操作为出栈。 顺序栈:栈的顺序存储结构,是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时设置指针top指示栈顶元素在顺序栈中的位置。 在顺序实现中,利用数组依次存放从栈底到栈顶的数据元素。 3.1.2 顺序栈 多栈共享空间:多个栈共享一个或多个数组,可以合理利用存储单元。 主要是2个栈共用一个数组,一个用前部分,一个用后部分。 最常用的是两个栈的共享技术: 它主要利用了栈“栈底位置不变,而栈顶位置动态变化”的特性。 共享栈示意图 3.1.3 链式栈 栈的链式存储结构称为链式栈,它是运算是受限的单链表。 链式栈无栈满问题,空间可扩充 插入和删除操作仅限制在栈顶位置上进行。 链式栈的栈顶在链头 由于只能在链表头部进行操作,故链表没有必要像单链表那样附加头结点。栈顶指针就是链表的头指针。 链式栈的类模板 部分成员函数模板的实现 栈的应用举例 由于栈结构具有的后进先出的固有特性,致使栈成为程序设计中常用的工具。以下是几个栈应用的例子。 括号匹配的检验 迷宫求解 栈与递归 括号匹配的检验 假设表达式中充许括号嵌套,则检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。 假设表达式中包含三种括号:圆括号、 方括号和花括号, 它们可互相嵌套, 如([ { } ]( [ ] ) )或( {( [ ] [( ) ] ) } )等均为正确的格式, 而 { [ ] } ) }或 { [( ) ] 或( [ ] }均为不正确的格式。 迷宫求解 栈与递归的实现 递归是指在定义自身的同时又出现了对自身的调用。 如果一个函数在其定义体内直接调用自己,则称其为直接递归函数。 如果一个函数经过一系列的中间调用语句, 通过其它函数间接调用自己,则称其为间接递归函数。 递归过程的实现 递归进层(i→i+1层)系统需要做三件事: 保留本层参数与返回地址(将所有的实在参数、 返回地址等信息传递给被调用函数保存) 给下层参数赋值(为被调用函数的局部变量分配存储区) 将程序转移到被调函数的入口 而从被调用函数返回调用函数之前,递归退层(i←i+1层)系统也应完成三件工作: 保存被调函数的计算结果 恢复上层参数(释放被调函数的数据区) 依照被调函数保存的返回地址, 将控制转移回调用函数 3.2 队列 抽象数据类型队列的定义 链队列——队列的链式表示和实现 循环队列——队列的顺序存储结构 3.2.1 队列的基本概念 定义:队列是只允许在一端删除,在另一端插入的线性表。 在队列中,允许插入的一端叫做队尾;允许删除的一端叫做队头。 特性:先进先出(FIFO, First In First Out) 3.2.1 队列的基本概念 例如:排队购物。操作系统中的作业排队。先进入队列的成员总是先离开队列。 因此队列亦称作先进先出(First In First Out)的线性表,简称FIFO表。 3.2.1 队列的基本概念 双端队列:一种限定性数据结构,限定插入和删除操作在表的两端进行的线性表。 这两端分别
文档评论(0)