数据结构第三章 栈和队列.docVIP

  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文档。上传文档
查看更多
第三章 栈和队列 一、八皇后问题 1.题目要求: 八皇后问题是在8*8的国际象棋棋盘上,安放8个皇后,要求没有一个皇后能够吃掉任何其他一个,即没有两个或两个以上的皇后占据棋盘上的同一行、同一列或同一对角线。 2.算法分析: 算法基本思想如下: ??? 从第1行起逐行放置皇后,每放置一个皇后均需要依次对第1,2,……,8列进行试探,并尽可能取小的列数。若当前试探的列位置是安全的,即不与已放置的其它皇后冲突,则将该行的列位置保存在栈中,然后继续在下一行上寻找安全位置;若当前试探的列位置不安全,则用下一列进行试探,当8列位置试探完毕都未找到安全位置时,就退栈回溯到上一行,修改栈顶保存的皇后位置,然后继续试探。 算法抽象描述如下: (1)?置当前行当前列均为1; (2)?while(当前行号〈=8〉 (3)?{检查当前行,从当前列起逐列试探,寻找安全列号; (4)?if(找到安全列号) (5)?放置皇后,将列号记入栈中,并将下一行置成当前行,第一列置为当前列; (6)?else (7)?退栈回溯到上一行,移去该行已放置的皇后,以该皇后所在列的下一列作为当前列; (8)?}结束程序。 二、表达式求值问题 1.题目要求: 表达式求值是编译系统中的一个基本问题,目的是把人们平时书写的算术表达式变成计算机能够理解并能正确求值的表达方法。表达式计算是实现程序设计语言的基本问题之一,也是栈和队列应用的一个典型例子。具体要求是:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的运算符优先关系,实现对算术四则运算表达式的求值。 2.算法分析: 为实现表达式求值,需要完成两个步骤: 1、利用栈,将中缀表达式转换成后缀表达式; 2、利用队列,将后缀表达式求值并输出。 三、马踏棋盘 1.题目要求: “马踏棋盘”又叫“马的遍历”、“骑士巡游”或者“骑士游历”,它是由上世纪中叶被欧洲的几位数学家提出的,后来由著名大数学家欧拉将各种解法归纳总结,系统的解决了这个问题。 “马踏棋盘”具体内容是:在8行×8列的棋盘上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即达到棋盘上的每一格,并且每格只能到达一次。 2.算法分析: 1.贪婪算法 贪婪算法就是一步一个最优解,每步都是有去无回的架势,做出这些最优解的策略号称贪婪准则(greedy?criterion)。? ????在设计程序解决“骑士游历”问题时,可以发现,外层格子比在棋盘中心附近的格子更难移动到。事实上,最难访问的是四角的格子。? 2.回溯法: (1)??棋盘的表示方法 我们可以用一个8×8的二维数组A(I,J)来表示国际象棋的棋盘,在马还没有开始周游棋盘时,棋盘上所有的格都置为零。以后,马跳到哪个格,就将马跳跃的步数记录在相应的空格里。 (2)??马的跳跃方向的确定 在国际象棋的棋盘上,一匹马共有八个可能的跳跃方向。 我们设置一组坐标增量来描述这八个条约方向: ①?(1,2)??????②?(2,1) ③?(2,-1)?????④?(1,-2) ⑤?(-1,-2)????⑥?(-2,-1)? ⑦?(-2,1)?????⑧?(-1,2) (3)?马的跳跃方向的表示 设I表示行,J表示列,行增量为DI(R),列增量为DJ(R),则马向某个方向试探性地跳跃一步之后的新坐标应该表示为:NI=I+DI(R),NJ=J+DJ(R)。 (4)?朝某个方向试探性地跳跃一步再看下一步(取下一步最小可走方向(处理边角问题)),任何一点的坐标加上要试探方向的坐标增量之后,都要判断一下是否已经超出了棋盘的边界。即:当I??0,或I??8,或J??0,或J??8时,都表示已经超出了棋盘的边界,这时,应该放弃该方向,转向试探下一个方向,在不出界的情况下,如果A(NI,NJ)=0,则表示该方向的前方有通路,可以继续向前跳跃。如果A(NI,NJ)0,则表示该格已经走过了,不能再走。放弃该方向,并转向下一个方向进行试探。 四、汉诺塔问题 1.题目要求: 传说所罗门庙里有一个塔台,台上有3根用钻石做成的标号为A、B、C的柱子,在A柱上放着64个金盘,每一个金盘都比下面的略小一点。把A柱上的金盘全部移到C柱上的那一天就是世界末日。移动的条件是,一次只能移动一个金盘,移动过程中大金盘不能放在小金盘上面。庙里的僧人一直在移个不停。因为全部移动次数是264-1,如果每秒移动一次的话,需要500亿年。 2.算法分析: 汉诺塔盘子之间的移动过程很复杂与烦琐,但规律性却很强。使用递归调用技术来解决这个移动过程,先得找到一个递归调用模型。想要得到汉诺塔问题的简单解法,着眼点应该是移动A杆最底部的大盘,而不是其顶部的小盘。不考虑64个盘而考虑N个盘的

文档评论(0)

132****9295 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档