第3讲栈和队列XU.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3讲 栈和队列 主要内容 栈的定义及ADT、存储表示及算法 栈的应用示例(表达式求值、回溯算法的栈应用) 递归算法的使用技巧 队列的定义及ADT、存储表示及算法 队列的应用示例 栈和队列 从数据结构的角度看 栈和队列也是线性表 但其操作是线性表操作的子集 栈只能从一端操作,后进先出(LIFO) 队列一端只能进,另一端只能出(FIFO) 从数据类型的角度看 是与线性表不同的两类重要抽象数据类型 栈( stack )定义 限定只能在表的一端进行插入和删除的特殊的线性表 设栈s=(a1,a2,. . . ,ai,. . . ,an), 其中a1是栈底元素, an是栈顶元素。 后进先出原则 LIFO ( last in first out ) 栈顶(top):允许插入和删除的一端; 栈底(base):不允许插入和删除的一端。 注意top指向的位置。 可以指向栈顶元素 可以指向当前栈顶元素上相邻的空位 (更常用) 栈的ADT ADT见P45 注意几个基本操作 设置空栈 插入新的栈顶元素(入栈操作,push) 删除栈顶元素(出栈操作,pop) 读取栈顶元素 依据其存储结构分为 顺序栈 栈采用顺序存取结构,称为顺序栈。 链栈 栈采用链表存取结构,称为链栈。 如何实现顺序栈? 整个线性表 每个元素 链栈 采用链式存储结构 约定插入、删除等操作只能在表头进行 可以不必像单链表那样附加头结点 栈顶指针就是链表的头指针 如何实现链栈? 整个线性表 每个元素 栈的应用举例---表达式求值 算符优先法 理解表达式(先只考虑算术四则运算) 先乘除,后加减 从左到右(结合律) 先括号内,后括号外 一个表达式由下面组成 操作数(常量、变量等) 操作符(只考虑 / * + - ) 左右括号( ( ) )和表达式结束符( # ) 表达式中相继出现算符间的优先关系无非三种,P53表 # 3 X ( 7 – 2 ) # 算法思路 使用两个栈:运算符栈OPTR和运算数及运算结果栈OPND 首先置OPND为空栈,置OPTR栈只有一个栈底元素为# 依次读入表达式中字符 若是操作数,进OPND栈 若操作符,和OPTR栈栈顶元素比较优先级 当栈顶元素优先级低“”,则此字符进OPTR栈; 当栈顶元素优先级高“”,则此操作符出OPTR栈,从OPND栈出两个数,进行操作符指定元素,结果进OPND栈; 当栈顶元素优先级一样“=”,则OPTR栈栈顶元素出栈; 整个表达式求值完毕(当前读入字符为#,栈顶元素也为#), OPND栈中元素为表达式结果。 表达式求值算法,见P53 算法运行过程分析,见P54 例 有两个栈s1和s2共享存储空间c(1,m),其中一个栈底设在c[1]处,另一个栈底设在c[m]处,试编写算法,对其中任一栈进行push和pop运算,要求只有整个空间占满时才产生上溢。 栈与回溯算法 背包问题描述 有一个背包,能盛放的物品总重量为 S,设有 N 件物品,其重量分别为w1,w2,...,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于 S 。 案例 能放的总重量:S = 10 各件物体重量:{1, 8, 4, 3, 5, 2} 0 1 2 3 4 5 //数组中位置 可能的解:(1,4,3,2)、(1,4,5) 、(8,2) 、(3,5,2) 回溯的设计思想 栈与回溯算法 回溯的设计思想 ① 先将物品排成一列,然后顺序装入背包 ② 选到第j件时,背包未满,但第j+1件时 正好,则是一个解 太大,则弃之,继续装下一件 ③ 如剩余的物品中没有了合适的,说明刚刚装入的物品不合适,将其取出,放在一边,继续从它之后选取,重复②过程。直到求出满足要求的解,或无解。 从背包中取出物品再搜索的策略,称为回溯。 后进先出,应用栈 栈与递归算法 用递归算法求解背包问题 递归算法的特征 为求解规模为N的问题,设法将它分解成较小规模的问题,而这较小规模的问题可以得出需要的解; 这较小规模的问题,还能分解成更小的,如此往复,最后能直接得到解。 注意以下几点 找到继续递归的条件,和递归结束的条件 想法将处理对象的规模变小 注意理解递归返回后,下一个语句的作用 理解递归函数的作用,选择使用递归函数的位置 队列 ( queue ) 限定只能在表的一端插入,另一端删除的特殊的线性表 队列的顺序存储结构 队列的顺序存储结构 循环队列---队列的顺序表示和实现 以存储空间大小为模取余,形成循环队列 循环队列基本算法描述 循环队列基本算法描述 循环队列基本算法描述 队列的应用举例 P65 #define MAXQSIZE 100

文档评论(0)

liudao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档