《数据结构课程设计》课件Word文档下载推荐.docx
《《数据结构课程设计》课件Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《数据结构课程设计》课件Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
![《数据结构课程设计》课件Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/20/9095eb82-8e30-4dd2-97b2-5d2637d3746c/9095eb82-8e30-4dd2-97b2-5d2637d3746c1.gif)
要求演示在求值过程中运算符栈、操作数栈、输入字符和主要操作过程及运算结果。
要求在算法用到栈和队列。
要求设计的数据结构与算法使算法的时间复杂度与空间复杂度尽可能低。
1.2中缀表达式到后缀表达式的转换
(1)问题分析
假设在算术表达式中只含四种基本运算符,操作数是10以内的整数。
假设一个中缀表达式中没有括号(如4+2*3,它的后缀表达式为423*+)。
在扫描到中缀表达式中的2后,能立即输出+,因为*具有较高优先级,必须先运算,因此需先保存+。
也就是说,新扫描运算符优先级必须与前一个运算符的优先级做比较,如果新的运算符优先级高,就要像前一个运算符那样保存它,直到扫描到第二个操作数,将它输出后才能将该运算符输出。
因此,在转化中必须保存两个运算符,后保存的运算符先输出。
用计算机来实现这个转化过程,就需要用到能后进先出的数据结构----栈。
如果在中缀表达式中含小括号,那么由于括号隔离了优先级规则,它在整个表达式的内部产生了完全独立的子表达式。
因此,前面的算法就需要有所改变。
当扫描到一个左括号时,需要将其压入栈中,使其在栈中产生一个“伪栈底”。
这样算法就可以像前面一样进行。
但当扫描到一个右括号时,需要将栈中从栈顶到“伪栈底”之间的所有运算符弹出,然后再将这个“伪栈底”删除。
(2)数据结构与算法设计
算法基本思想:
利用栈(运算符栈)将中缀表达式转换为后缀表达式。
顺序扫描中缀表达式,当读到数字时,直接将其送至输出队列中;
当读到运算符时,将栈中所有优先级高于或等于该运算符的运算符弹出,送至输出队列中,再将当前运算符入栈;
当读入左括号时,将其入运算符栈;
当读到右括号时,将栈中从栈顶到靠近栈顶的第一个左括号(“伪栈底”)之间的所有运算符全部依次弹出,送至输出队列中,再删除栈中的左括号。
算法设计要求:
将表达式中的操作数规定为1位数字字符。
也可根据个人的能力对这部分功能进行扩充,使得操作数可以是多位数,甚至可以是小数或负数。
运算符可只包含+、-、*、/四种基本运算。
也可根据需要对算法的功能进行扩充,允许有其它运算符。
为了简化算法,可认为扫描到的任何运算符,其优先级都比栈顶的左括号优先级高。
为了方便边界条件(栈空)判断,提高算法运行效率,在扫描中缀表达式之前,在空栈中预先压入一个‘#’字符作为栈底元素,另外,在中缀表达式的最后增加一个‘#’字符作为中缀表达式的结束标志,当扫描到结束符‘#’时,将栈中从栈顶到‘#’之间的所有运算符全部依次弹出,送至输出队列中,再删除栈中的‘#’,并结束算法。
算法应该能够过滤掉输入符号之间的空格。
也可对本算法功能进行扩充,使其具有对对输入表达式进行语法检查的功能。
要求输出中间结果及最终结果,最好能在算法运行过程中演示运算符栈和存放后缀表达式的队列的变化情况。
如,若输入的中缀表达式字符串:
1+2*(3-1+2)-3#,就会得到后缀表达式:
1231-2+*+3-,在算法运行过程中,运算符栈和存放后缀表达式的队列变化过程如表1-1所示。
表1-1中缀表达式到后缀表达式的转换过程示例
转换步骤
中缀表达式的读入
运算符栈
后缀表达式
初始
1+2*(3-1+2)-3#
#
空
1
+2*(3-1+2)-3#
1
2
2*(3-1+2)-3#
#+
3
*(3-1+2)-3#
#+
12
4
(3-1+2)-3#
#+*
5
3-1+2)-3#
#+*(
6
-1+2)-3#
123
7
1+2)-3#
#+*(-
8
+2)-3#
1231
9
2)-3#
#+*(+
1231-
10
)-3#
1231-2
11
-3#
1231-2+
12
3#
#-
1231-2+*+
13
1231-2+*+3
14
1231-2+*+3-
1.3后缀表达式的计算
在后缀表达式中,不仅不需要括号,而且还完全免除了运算符优先规则。
后缀表达式只需要从左到右顺序计算。
后缀表达式中可能有多个运算符,如1231-2+*+3-,因此必须像输入字符一样保存中间结果。
在计算后缀表达式时,最后保存的值最先取出参与运算,所以需要用栈来存储操作数及中间结果。
因为在生成的后缀表达式队列中,存放的是字符序列,因此在算法中要有一个数字字符到数值的转换。
(2)算法设计
利用栈(操作数和运算结果栈)计算后缀表达式。
顺序扫描后缀表达式,当读到数字时,将其送至栈中;
当读到运算符θ时,将栈顶字符弹出,将其转换成对应的数值并赋给变量y,再将次栈顶字符弹出,将其转换成对应的数值,并赋给变量x,之后计算xθy,将运算结果转换成对应的数字字符送入栈中。
注意,本算法主要涉及两种数据结构:
队列和栈。
本算法可以对任意输入的后缀表达式进行计算,也可以以前一个中缀表达式到后缀表达式转换算法的输出为输入,计算该后缀表达式。
要求显示算法的运行结果。
最好能在算法运行过程中演示运算结果栈的变化情况。
以输入的后缀表达式为1231-2+*+3-的情况为例,在算法运行过程中,操作数及运算结果栈变化过程如表1-2所示。
表1-2后缀表达式计算过程示例
计算步骤
后缀表达式的读入
231-2+*+3-
31-2+*+3-
1-2+*+3-
-2+*+3-
2+*+3-
122
+*+3-
1222
*+3-
124
+3-
18
3-
9
-
93
6
1.4中缀表达式的计算
要把一个表达式翻译成正确求值的机器指令序列,首先要能够正确解释表达式。
要对算术表达式求值,首先要了解算术四则运算规则。
即:
先乘除,后加减;
同级从左到右计算;
先括号内,后括号外。
例如,1+2*(3-1+2)-3=1+2*(2+2)-3=1+2*4-3=1+8-3=9-3=6
任何一个表达式都是由操作数、运算符、界限符组成的。
操作数既可以是常数,也可以是说明为变量或常量的标示符;
运算符可以分为算术运算符、关系运算符和逻辑运算符3类;
基本界限符有左右括号和表达式结束符等。
为了简化问题,运算符可只包含+、-、*、/四种基本运算,括号只有圆括号。
可根据需要及个人能力对算法的功能进行扩充,允许有其它运算符。
算符之间的优先关系如表1-3所示。
表1-3算符之间的优先关系表
+
-
*
/
(
)
#
>
<
=
x
建立并初始化操作数栈和算符栈,将表达式起始符‘#’压入算符栈。
依次读入表达式中的每个字符,当读入的字符ch是操作数,将其入操作数栈;
当读入的字符ch是运算符,则根据运算符栈的栈顶元素和ch的优先权比较结果,做不同的处理:
若是小于,则ch压入运算符栈,读入下一个字符。
②若是大于,则弹出运算符栈顶的运算符,从操作数栈弹出两个数,进行相应运算,将结果压入操作数栈。
③若是等于,则运算符栈顶元素是‘(’且ch是‘)’,这时弹出运算符栈顶的‘(’,相当于去括号,然后读入下一个字符。
当读入的字符ch是‘#’,且运算符栈顶元素也是‘#’时,算法结束。
也可根据个人的能力对这部分功能进行扩充,使得操作数可以是多位数。
算法应能对由键盘输入任意中缀表达式进行计算。
要求在算法运行过程中演示运算符栈和操作数栈的变化情况,并显示最终运算结果。
1.5评价标准
若本实验项目占100分,则其中,
(1)基本功能占60分,具体分值分部如下:
●中缀表达式到后缀表达式的转换(20分)
●后缀表达式的计算(20分)
●中缀表达式的计算(20分)
(2)附加功能占20分,具体分值分部如下:
●具有语法检查功能(含滤空格、除零异常处理、括号匹配否判断等功能)。
(4分)
●除了用键盘输入数据外,还可以将前一个运算的结果(以指定特定文件形式)作为下一个运算的输入。
(2分)
●能演示算法运行过程中运算符栈和操作数栈的变化情况。
(3分)
●能处理多位数、负数及小数的运算。
●能实现除了基本的加减乘除运算以外的其他运算,每增加一个运算加一分,直到加满4分为止。
●界面友好,使用方便,最好能有图形界面。
(3)设计报告占20分。
二、哈夫曼编码/译码问题
2.1问题定义及设计要求
哈夫曼算法应用非常广泛,本节以哈夫曼编码为例说明哈夫曼算法的应用。
在电报通信中,电文是以二进制的0、1序列传送的。
发送方需将电文中的字符转换成二进制的0、1序列(编码);
接收方则需将收到的电文转化为对应的字符序列(译码)。
最简单的编码方式是等长编码,假设电文中字符串仅有26个大写的英文字母组成,采用等长的二进制编码时,每个字符用5位二进制位串表示即可(25>
26)。
接收方只要按5位分割进行译码就可得到对应的字符。
一般来说字符集中的字符在电文中出现的频率是不均匀的,例如,英文中使用A和E较Z要频繁的多。
因此,若让使用频率高的字符编码尽可能短,则可使传送的电文总长缩短。
然而使用不等长编码可能使译码产生多义性的电文,例如,若用00表示A,01表示E,0001表示Z,则当接受方接收到串0001时,无法确定原文是AE还是W。
产生该问题的原因是A的编码是Z的编码的前缀。
因此,若对某个字符集进行不等长编码,则要求字符集中任何一个字符的编码都不是其它字符编码的前缀,这种编码叫前缀(编)码。
假设组成电文的字