网站大量收购独家精品文档,联系QQ:2885784924

数据结构与算法3解析.ppt

  1. 1、本文档共49页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与算法3解析

3.4 队列的表示及实现 在图3-6(d)状态时,如果还有新元素请求入队时,由于rear循环指向了0,所以能够进行入队操作,解决了“假上溢”的问题。但是,在队列满的3-5(c)状态和队列空的3-6(a)或3-6(e)状态,都有相同的front==rear关系。因此,在循环队列中,仅依据头尾指针相等是无法判断队列是“空”还是“满”。 要解决判断循环队列是空还是满的问题,可以采用两种方法: (1)约定少用一个元素空间。入队前,如果关系“(rear+1)%(MaxSize-1)==front”存在,就认为队列已满,再要插入就会发生溢出。可见,这种方法rear始终指向那个空闲的元素空间。 (2)使用一个计数器size记录当前队列的实际长度。如果size=0,则当“front==rear”时,当前队列是空队列,可以进行入队操作;否则,当前队列满,不能进行入队操作。 3.4.1 队列的顺序表示及实现 【例3-2】在屏幕上显示杨辉三角。杨辉三角的特点是第n行有n个数,除了第一个数和最后一个数是1外,其他数是上一行中位其左右的两个数之和。如图3-7所示的是6行杨辉三角的情况。图3-7 杨辉三角 分析:根据第i行和第i+1行的变换规律,可以用循环队列来完成杨辉三角的显示任务。具体方法将第1行的1入队,然后循环进行如下操作:在输出第i行时,计算第i+1行的数据并将他们依次入队。为了便于计算,将队列的最大容量设置为n+2,在相邻的两行元素之间加一标识‘0’来区别不同行的队列元素。通过不断地入队和出队,来完成杨辉三角的输出。下面基于LinearStack类模板生成数据类型为int类的模板类对象,直接使用类中的相应成员函数解决这个问题。 3.4 队列的表示及实现 3.4.1 队列的顺序表示及实现 队列的链式存储结构是仅在表头删除结点和在表尾插入结点的单链表,也为链接队列。因为需要在表头进行删除操作和在表尾进行插入操作,所以在链接队列中,需要增加指向队头和队尾的两个指针front和rear。这样,一个链接队列就由一个头指针front和一个尾指针rear唯一地确定了。 图3-8是存储了n个元素的链接队列的示意图。 3.4 队列的表示及实现 3.4.2 队列的链式表示及实现 图3-8 链接队列示意图 3.5 应用实例 栈的实际应用相当广泛,例如,除数制的转换外,栈还可用于解决括号匹配检查、行编辑处理和表达式求解、走迷宫,以及高级语言中函数的嵌套调用和递归的实现等问题。 队列在日常生活中应用也很多,特别是在计算机科学领域中所起的作用很大,例如,操作系统中各种资源请求排队和各种缓冲区的先进先出管理,各种应用系统中的事件规划和事件模拟,树的层次遍历和图的广度优先遍历等,都使用了队列这样的数据结构。 3.5 应用实例 3.5.1 栈的应用实例 3.5.2 队列的应用实例 【例3-3】计算机的编译程序需要检查一个表达式中括号是否匹配问题。如在C++语言中,表达式中允许使用两种括号:圆括号和方括号。设计一种对C++语言的表达式中的括号是否匹配进行检验的算法。 求解思路:括号匹配的处理过程与栈的特点相吻合,可以用栈来实现。具体算法是:从左向右扫描表达式,并设置一个栈,若是左括号则压入栈中;若是右括号,如果它能与当前栈顶元素相匹配,则删除栈顶元素,继续下一次扫描,如果不能与栈顶元素匹配,则认为当前表达式括号匹配不正确而返回。下面采用链接栈来实现“检查括号是否匹配”的问题,假设一个表达式的结束符为‘#’。 3.5 应用实例 3.5.1 栈的应用实例 下面举一个用队列来解决的生活中常见的日程安排问题。 【例3-4】运动会日程安排问题。设计一个算法,使运动会的日程最短,同时保证每个运动员参加的不同项目在时间安排上不会出现冲突。 3.5 应用实例 3.5.2 队列的应用实例 图3-9 项目时间冲突矩阵 分析:问题实质是将项目分成几个组,使参加每组中项目的运动员在时间上不会发生冲突;为了使运动会的日程最短,划分的项目组数要最少。运动员项目在时间上的冲突关系可以用一个矩阵R来表示出来,如图3-9所示。假设一名运动员报名参加项目1和项目3,则表示这两个项目在时间上冲突,在图3-9中的矩阵R的元素r1,3或r3,1的值就是1。如果没有任何运动员同时参加项目1和项目3,则矩阵R的元素r1,3或r3,1的值就是0。 3.5 应用实例 3.5.2 队列的应用实例 具体实现方法:假设有n个项目,用一个二维数组R存放项目的冲突关系矩阵,用队列Q来存放待分组的项目编号,初始时为0,1,2,…,n-1。用Group[]存放当前划分到同一组的项目号,数组元素初始值都为0。用一维数组Result[n]来存放项目被划分的组

您可能关注的文档

文档评论(0)

little28 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档