数据结构是计算机相关专业的重要基础课,算法是数据结构教学的重点和难点。然而,用传统的“粉笔 +黑板”形式很难将算法的执行过程动态地演示出来,影响了教学效果。在此背景下有必要设计一个数据结构辅助教学系统 ,帮助学生更快地掌握算法。
本系统以清华大学出版社出版的C语言版《数据结构》为蓝本,选择数据结构中部分算法并在系统中进行有机地组合,形成优化的动态演示系统。
“数据结构算法设计和演示”是在面向对象思想和技术的指导下,采用面向对象的编程语言(C++)和集成可视化的编程工具(Microsoft Visual C++ 6.0)开发出来的小型应用系统。它的功能主要是将数据结构中树的典型算法和数据结构用面向对象的方法封装成类,并通过类的对外接口和对象之间的消息传递来实现这些算法,同时利用Microsoft Visual C++ 6.0 中丰富的控件资源和系统资源对算法实现过程的流程和特性加以动态的演示,从而起到在数据结构教学中帮助理解、辅助教学和自我学习的作用。
人类的可视化功能,允许人类对大量抽象的数据进行分析。人的创造性不仅取决于人的逻辑思维,而且取决于人的形象思维。所以,可视化对人的认知有着极为重要的作用。算法可视化是将一个程序的数据、操作和语义提取出来并进行动态演示,利用诸如图形、文本、颜色、声音、编码、动画和视频等多媒体工具集合来描述算法。
算法可视化的任务就是动态演示图形变化的全过程,并将参数的改变而引起的影响以改变图形的形式直观地呈现在学习者面前,使学习者通过交互控制的方式,深入体会每个参数在图形变换中的功能及作用,从而达到透彻理解算法本身的目的。
发展可视化的重点和难点就在于真实直接的反映事物的本质信息。在构筑数据模型生成可视化信息的时候要充分考虑到设计要求。
本文所讨论的数据结构各种算法可视化不是简单的绘图,更不是单纯的将数据结构的算法程序摆在学习者面前,而是要从某种算法理解上的难点出发,采用不同的方法来诠释这样的难点,让学习者可以通过视觉上的感受和冲击来体会算法执行过程中的奥秘。而这些用来诠释难点的方法,我们统称为动态演示技术[2]。这些技术在后面的章节中会详细讨论。
算法是数据结构课程学习的关键内容[4],下面我将具体介绍一些常用算法的知识:
(1)线性表
线性表是由n(n≥0)个类型相同的数据元素组成的有限序列。
(2)栈和队列
① 栈的定义
栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。结论:后进先出(Last In First Out),简称为LIFO线性表。
② 队列定义
队列特殊性在于限定插入在线性表的一端进行,删除在线性表的另外一端进行。结论:先进先出(First In First Out),简称为FIFO线性表。
(3)树和二叉树
① 树的定义
树是一种常用的非线性结构。我们可以这样定义:树是n(n≥0)个结点的有限集合。若n=0,则称为空树;否则,有且仅有一个特定的结点被称为根,当n>1时,其余结点被分成m(m>0)个互不相交的子集T1,T2,...,Tm,每个子集又是一棵树。由此可以看出,树的定义是递归。
② 二叉树的定义和基本运算
二叉树是另一种树形结构。它与树形结构的区别是:每个结点最多有两棵子树和子树有左右之分。
③ 遍历二叉树有三种方法:先序遍历、中序遍历和后序遍历。