第九章 综合应用实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

9.3 用静态栈数据结构实现表 达式求值
[ 问题描述 ] 当用户输入一个合法的表达 问题描述] 式后,能够返回正确的结果.能够计算 的运算符包括:加,减,乘,除,括号; 能够计算的数要求在实数范围内.对于 异常表达式给出错误提示.
[ 基 本 需 求 ] 数 据 对 象 : D={ ai |ai∈ElemSet,i=1,2,3,……,n ,n≥0} 数据关 系 : R={<ai-1,ai,)>| ai-1,ai ∈D, i=2,3,……,n}约定a1为栈底,an 为栈顶.基 本操作:Push(&s,e) 初始条件:栈s已经存在. 操作结果:插入元素e为新的栈顶元素 Pop(&s,&e) 初始条件:栈s已经存在且非空. 操作结果:删除s的栈顶元素,并用e返回其值
第9章 综合应用实例
9.1 9.2 9.3 9.4 9.5 约瑟夫环问题 赫夫曼编译码器 用静态栈数据结构实现表达式求值 最小生成树kruskal算法 汉诺塔游戏程序
9.1 约瑟夫环问题
[问题描述 约瑟夫(Joseph)问题的一种描述: 问题描述] 问题描述 编号为1,2,……,n的n个人按顺时针方向围 坐一圈,每人持有一个密码(正整数).一开 始任选一个正整数作为报数的上限值m,从第 一个人开始按顺时针方向自1开始顺序报数,报 到m的人出列,将他的密码作为新的m值,从 他在顺时针方向上的下一个人开始重新从1报 数,…,如此下去,直到所有人全部出列为止. 试设计一个程序求出出列顺序.
1. 根据问题描述,可以将问题解决分为三步: (1)将A位置的(N-1)通过C位置,移动B;
(2)将A位置的最后一个,直接移到C位置; (3)将B位置的(N-1)个通过A位置,移动到C. 完成整个任务. 其中的一和三步,原理完全一样,只是位置不同, 而一步或三步的完成,又可看作初始问题的解决,以 三步为例,即在上面移动的基础上,将B位置的(N-2) 个通过C移动到A,再将B位置的(N-1)直接移动到C, 再将A位置的(N-2)个移动到C位置. 其余的依次类推,直到N=1时为至. 以上的过程,正是我们C函数中的递归调用.
9.5 汉诺塔游戏程序
[ 问题描述 ] HANOI塔问题是指:在平面 问题描述] 上有三个位置:A,B,C,在A位置上有N 个大小不等的长方形塔,从下至上,依 次排放,要求将A位置的N个长方形塔, 通过B位置,移动到C位置上.
[基本要求] 基本要求] (1)要求用C类的思想来完成程序的 设计. (2)完成的程序界面要美观,能够完 成游戏的整个过程.
[ 基本要求 ] 可以利用单向循环链表存储结构 基本要求] 模拟此过程,按照出列的顺序打印出,要求打 印出各人的编号和密码. [ 实现提示 ] 用不带头结点的单循环链表表示 实现提示] 一圈人的编号和密码,程序一开始,要求用户 指定初始报数的上限值,然后依次输入各人的 密码. [程序实现] 用一个结构体表示每个人的编号 程序实现] 和密码,将结构体连起来构成循环单链表. 程 序见188~190.
1) 编码结果以文本方式存储在文件CodeFile中. 2) 用户界面可以设计为"菜单"方式:显示上述功能 符号,再加上"5",表示退出运行Quit.请用户键入一 个选择功能符.此功能执行完毕后再显示此菜单,直 至某次用户选择了"Q"为止. 3) 在程序的一次执行过程中,第一次执行1,2或3命 令之后,哈夫曼树已经在内存了,不必再读入.每次 执行中不一定执行I命令,因为文件hfmTree可能早已建 好.程序见191~199.
[ 实现提示 ] 下面看程序,读入一个带权 实现提示] 连通无向图G,生产最小生产树T,输出T 的各边及各边的权之和.输入形式如下: n i j w ... -1 -1 -1 n表示图的顶点个数,i j w 表示从顶点 i 到顶点j 的权为w 的一条边. 我们的做法是读入一条边后按照权值由 小到大的顺序把这条边插入链表,然后 从链表中读边生产树.程序见208~212.
[基本要求 基本要求]一个完整的系统应具有以下功能: 基本要求 (1)I:初始化(Initialization).从终端读入字符集 大小n,以及n个字符和n个权值,建立哈夫曼树,并将 它存于文件hfmTree中. (2)E:编码(Encoding).利用已建好的哈夫曼树 (如不在内存,则从文件hfmTree中读入),对文件 ToBeTran中的正文进行编码,然后将结果存入文件 CodeFile中. (3)D:译码(Decoding).利用已建好的哈夫曼树 将文件CodeFile中的代码进行译码,结果存入文件 TextFile中. (4)P:印代码文件(Print).将文件CodeFile以紧凑 格式显示在终端上,每行50个代码.同时将此字符形 式ቤተ መጻሕፍቲ ባይዱ编码文件写入文件CodePrin中. (5)T:印哈夫曼树(Tree printing).将已在内存中 的哈夫曼树以直观的方式(树或凹入表形式)显示在 终端上,同时将此字符形式的哈夫曼树写入文件 TreePrint中
[实现提示] 实现提示] (1)利用下面这道题中的数据调试程序. 某系统在通信联络中只可能出现八种字符,其 概率分别为0.25,0.29,0.07,0.08,0.14, 0.23,0.03,0.11,试设计哈夫曼编码. (2)用下表给出的字符集和频度的实际统计 数据建立哈夫曼树,并实现以下报文的编码和 译码:"THIS PROGRAM IS MY FAVORITE".

[基本要求 基本要求]比如,一个图中所有边按权值递增 基本要求 的排序如下: (4,5)2 (3,4)3 (1,4)5 (1,3)6 (1,2)7 (2,4)8 (2,5)8 (3,5)9 (1,5)12 (2,3)14 步骤1:将(4,5)的边加到生产树中 步骤2:将(3,4)的边加到生产树中 步骤3:将(1,4)的边加到生产树中 步骤4:将(1,3)的边加到生产树中,但发现这 时出现了回路(1,3,4 顶点),我们改用下条边 (1,2)加到生产树中,现在已经连通了1 2 3 4 5 所 有顶点,最小生产树建立完成.程序见203~207.
2.问题的数学描述: 依据四的分析,可以构造两个函数来解决这个 问题:一个为: hano(int n,char a,char b,char c), 产生递归调用,其中n为移动的个数,a,b,c 分别为从哪里经过哪里到哪里这三个位置. 另一个就是移动函数: move(char a,char c), 表示从哪里移动到哪里,a和c同上.其递归调 用关系如下所述:
9.2 赫夫曼编译码器
[问题描述 问题描述]利用哈夫曼编码进行通信可以大大 问题描述 提高信道利用率,缩短信息传输时间,降低传 输成本.但是,这要求在发送端通过一个编码 系统对待传数据预先编码,在接收端将传来的 数据进行译码(复原).对于双工信道(即可 以双向传输信息的信道),每端都需要一个完 整的编/译码系统.试为这样的信息收发站写一 个哈夫曼码的编/译码系统.
[实现提示 程序流程图(图9-1程序流程图)程序 实现提示] 实现提示 见199~202.
开始 读下一个字符算法
factor算法 建立栈 存放操作字符 存放数据 表达式求值算法 计算 结束
图9-1程序流程图
9.4 最小生成树kruskal算法
[问题描述 问题描述]kruskal 算法是根据边的权值 问题描述 以递增的方式,依次找出权值最低的边 来建最小生成树,规定每次添加的边不 能造成生产树有回路.
相关文档
最新文档