第一篇:PHP 程序员学数据结构与算法之《栈》
PHP 程序员学数据结构与算法之《栈》
介绍
“要成高手,必练此功”。
要成为优秀的程序员,数据结构和算法是必修的内容。而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈操作array_pop,进栈操作array_push,都有指定的库函数,导致我们对基础算法的研究越来越少,最后成为一个工具的傀儡而已。
所以我还是建议更多的coder从基础开始学习。这篇就先讲我们最熟悉的栈操作开始入手,让我们熟悉栈。
栈为何物?
口诀“后进先出”,这是我印象最深的一句话,也是老师一坨讲解中,印象最深刻的。
定义:栈是限制插入和删除都只能发生在一个位置上进行的线性表,该位置是线性表的末端,叫做栈的顶。
过程:先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
分析
通过定义和过程,我们分析出数据结构(红色标识),动作部分(蓝色标识),以及动作的规则(黄色标识)。
请看
lv包包、古奇女包、coach包:www.xiexiebang.com|兔毛皮草、獭兔皮草、皮草服饰:www.xiexiebang.com
组成成分
数据:线性表(用array结构保存命名为data),末端索引(用int结构保存命名为end,初始值为null——因为开始线性表是没有元素的,所以就没有末端索引这么一说,而且由于不断取数据,添加数据,这个末端是变化的元素。)。
动作(方法):压入(push:规则,放在线性表最后面),弹出(pop:规则,从最后取出,并且末端位置向前移动)。
编码
lv包包、古奇女包、coach包:www.xiexiebang.com|兔毛皮草、獭兔皮草、皮草服饰:www.xiexiebang.com
运行结果
lv包包、古奇女包、coach包:www.xiexiebang.com|兔毛皮草、獭兔皮草、皮草服饰:www.xiexiebang.com
总结
以上是本人对栈的分析理解过程,由于我是一名php coder,所以我用php的角度去分析和编码。
如果是C语言去编码,数组应该指定最大宽度,因为C语言数组不像php数组能自行增长,必须要有一个初始宽度。
lv包包、古奇女包、coach包:www.xiexiebang.com|兔毛皮草、獭兔皮草、皮草服饰:www.xiexiebang.com
第二篇:数据结构栈与队列报告
栈和队列上机实习
1、实验目的:
(1)熟练掌握栈的逻辑结构和操作规则,能在相应的实际问题中正确选用该结构。(2)熟练掌握栈的2种存储结构实现方法(顺序栈和链栈),两种存储结构和基本运算的实
现算法,注意栈空盒满的判断条件及它们的描述方法。
(3)熟练掌握队列的逻辑结构和操作规范,能在相应的实际问题中正确选用该结构。(4)掌握循环队列与链队列两种存储结构的实现,熟练掌握各种队列基本运算的实现。
2、实验要求:
(1)顺序栈的插入、删除,栈顶数据元素的读取。(2)链栈的插入、删除,栈顶数据元素的读取。(3)循环队列的插入、删除。(4)链队列的插入、删除。
3、实验内容: ① 栈
(1)抽象数据类型定义
typedef struct
{
ElemType data[MaxSize];
//栈的空间大小为MaxSize
int top;
//设置栈顶指针
}SqStack;
//栈的结构定义
在本次实验中,首先建立一个空栈,进入主程序后首先初始化栈为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入栈,出栈,读取栈顶元素,显示栈的所有元素,栈的长度,释放栈等操作。
(2)存储结构定义及算法思想
在栈结构体的定义中,typedef int Typeelem 为整型,存储结构(入栈)如下:
cin>>a;
s->top++;
//在入栈是首先将栈顶指针向上加1
s->data[s->top]=a;
//与数组赋值一样,直接赋值
//其他存储与此类似,都是直接赋值与数组的某一位
退栈函数模块:
void Pop(SqStack * &s){
//对指针的引用
if(s->top ==-1){
cout<<“栈是空栈,不能退栈”< //首先判断是否为空栈,若为空,则退出 return;} cout<<“退栈的元素为:”< //显示退栈元素 s->top--; //栈顶元素减1,指向实际栈的最上面 } 显示栈所有元素函数模块: void DispStack(SqStack *s){ //从栈顶到栈底顺序显示所有元素 int i;cout<<“栈的元素分别为:”< //同过循环实现实现从栈顶元素到栈底元素的遍历以输出 } cout< 栈结构的入栈和退栈是两个相反的过程,先进后出,入栈是先让栈顶指针加1,指向未被赋值位置,然后进行赋值,退栈是先取出退栈元素,然后栈顶元素减1,指向推展后的实际栈顶。诸如读取栈顶元素,显示栈的元素,读取栈的长度,都是用过对栈顶指针实现相关操作。 (3)实验结果与分析 ② 循环队列 (1)抽象数据类型定义 typedef struct { ElemType elem[Maxqsize]; //循环队列的长度为MaxSize int front,rear; //设置队列的头指针和尾指针 }SqQueue; //循环队列的结构体定义 在本次实验中,首先建立一个空队列,进入主程序后首先初始化队列为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入队,出队,显示队列的所有元素,队列的长度,释放队列等操作。 (2)存储结构定义及算法思想 在队列结构体的定义中,typedef int Typeelem 为整型,存储(入队)结构如下: q->rear=(q->rear+1)%Maxqsize; //尾指针加1 q->elem[q->rear]=a; //将入队元素装到新的空尾部 在此队列的存储结构的实现:先让队尾指针进1,再将新的元素加入到队尾指针所指示的位置,因此,队尾指针指示实际的队尾位置,队头指针指示实际队头的前一位置,要想退出队头元素,必须先让队头指针进1,才能取出队头元素。 退队函数模块如下: void deQueue(SqQueue *&q){ //对指针的引用 if(QueueEmpty(q)) { //调用带返回值的判断空队函数 cout<<“队列为空”< //判断队列是否为空 } q->front=(q->front+1)%Maxqsize; //队头指针进1 cout<<“退队的元素为:”< //取出队头元素 } 遍历队表函数: void displayqueue(SqQueue *q){ int m;m=q->front+1; //队头元素进1,指向实际队头 if(QueueEmpty(q)) { cout<<“队列为空”< //判断是够为空队 } cout<<“所有队列元素为:”< while(q->rear+1>m){ cout< //通过循环遍历所有元素 m++; } cout< 循环队列的入队和退队分别是在队尾与队头跟别进行操作的,通过队头队尾指针的操作便可实现对队列的相关操作。 (3)实验结果与分析 ③ 心得体会 本次上机是做栈与队列的操作,这次实验,我有意的用到了对指针的引用与指针实现子函数功能的调用,刚开始编译的时候也有错误,但是在慢慢的摸索中,也逐渐掌握了它们的用法,这次实验也让我熟练了对队列与栈存储结构的应用。 附录: 顺序表源代码: 栈: #include void InitStack(SqStack * &s) //建立一个空栈,即将栈顶指针指向-1即可 的引用 { s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;} void ClearStack(SqStack * &s) //释放栈s占用的存储空间 { free(s);} void StackLength(SqStack *s) { cout<<“栈的长度为:” <<(s->top +1)< int StackEmpty(SqStack *s){ return(s->top==-1);} void Push(SqStack *&s){ if(s->top==MaxSize-1) { cout<<“栈满”< // s=(SqStack *)realloc(s,sizeof(SqStack));} int a; 指针 cout<<“请输入入栈元素”< void Pop(SqStack * &s){ if(s->top ==-1){ cout<<“栈是空栈,不能退栈”< return;} cout<<“退栈的元素为:”< void GetTop(SqStack * &s,ElemType &e){ if(s->top==-1){cout<<“空栈”< void DispStack(SqStack *s) //从栈顶到栈底顺序显示所有元素 { int i;cout<<“栈的元素分别为:”< cout<<“请选择功能”< cout<<“ 入栈 1”< cout<<“ 出栈 2”< cout<<“ 读取栈顶元素 3”< cout<<“ 显示栈所有元素 4”< cout<<“ 栈的长度 5”< cout<<“ 释放栈 6”< cin>>k; switch(k) { case 1: Push(s);break; case 2: Pop(s);break; case 3: GetTop(s,e);cout<<“栈顶元素为: ”< case 4: DispStack(s);break; case 5: StackLength(s);break; case 6: ClearStack(s);break; default :break; } } } 队列: #include TypeElem elem[Maxqsize]; int front,rear;}SqQueue;void InitQueue(SqQueue *&q){ q=(SqQueue *)malloc(sizeof(SqQueue)); q->front=q->rear=0;} void ClearQueue(SqQueue *&q){ free(q);exit(0);} void QueueLength(SqQueue *q){ cout<<“队列长度为:”<<(q->rear-q->front+Maxqsize)%Maxqsize< return(q->front==q->rear); } void enQueue(SqQueue *&q){ int a; if((q->rear+1)%Maxqsize==q->front) { cout<<“队列已满,无法插入”< } cout<<“请输入插入元素”< cin>>a; q->rear=(q->rear+1)%Maxqsize; q->elem[q->rear]=a;} void deQueue(SqQueue *&q){ if(QueueEmpty(q)) { cout<<“队列为空”< } q->front=(q->front+1)%Maxqsize; cout<<“退队的元素为:”< } void displayqueue(SqQueue *q){ int m;m=q->front+1; if(QueueEmpty(q)) { cout<<“队列为空”< } cout<<“所有队列元素为:”< while(q->rear+1>m) { cout< m++; } cout< int k=0; SqQueue *q; InitQueue(q); if(QueueEmpty(q))cout<<“队列为空”< while(1){ cout<<“请选择功能”< cout<<“ 入队 cout<<” 出队 cout<<“ 队列长度 cout<<” 显示队列元素 cout<<“ 释放栈 cin>>k; switch(k) { case 1: enQueue(q);break; case 2: deQueue(q);break; case 3: QueueLength(q);break; case 4: displayqueue(q);break; case 5: ClearQueue(q);break; default :break; } } } 1”< 2“< 4“< **的个人简历 个人资料 姓名: **电子邮件: ******@qq.com 名族: 汉出生日期: 1991/1/3 学历: 本科居住地址: 深圳福田 性别: 男手机号码: 186***7739 4求职意向 到岗时间:即时 期望职位:php程序员 工作性质:全职 专业技能 1、熟练掌握PHP,HTML,DIV+CSS,Javascript,Ajax,jQuery等Web开发技术。 2、熟练使用PDO、MySQL方式操作MySQL数据库系统,熟悉MySQL事物及存储过程。 3、熟悉HTML,DIV+CSS前台页面技术和XML的使用。 4、熟悉网页静态化、Smarty缓存,thinkPHP缓存,掌握Web防SQL注入。 5、孰悉MVC架构开发思想模式,熟练使用Smarty模板,ThinkPHP框架,ZendFramework框架。 6、熟练掌握Zend Studio, Dreamweaver,Notepad++, EclipsePHP等常用Web开发工具; 7、了解Linux基本操作。 项目经验 项目一 项目名称:地球新闻网 软件环境: 开发工具: 项目描述: linux+apache+mysql+php Zend Studio 1.该项目是一个集各种新闻的网站。2.前台采用div+css,javascript等 技术进行页面布局,Javascript和Jquery技术制作下拉菜单、表单验证、复选框等效果。3.后台采用全面向对象开发,良好的运用了MVC三层架 构模式。 责任描述:独立开发 项目体会:通过开发这次项目,使我对制作一个网站有了一个全面的了解,也同时增 加了我的技术能力;通过该网站使我了解只有想不到,没有做不到。同时 也想到在这个发展迅速的社会,我们只有不断努力学习新的技术才能满足 客户的要求。 项目二 项目名称:聚焦购物商城 软件环境: 开发工具: 项目描述: windows+apache+mysql+php Zend Studio 8.0 该项目是一个大型的网站商城,采用thinkPHP主流框架开发。 前台包括:商品列表、搜索、商品详细页、注册、登录、购物车、会员 中心、评论等。后台有:商品管理、订单管理、会员管理、商家管理等。 满足用户购物流程的各种需求 责任描述: 负责完成了MySQL数据表、字段、索引的分析与创建,主页的图片轮换,商品详细 页,购物车模块,登录注册等功能,以及后台商品管理模块。 项目体会:通过此次项目的实战,让我对thinkPHP的掌握更加深刻,同时给我感觉的是使用模板的开发速度之快,更实现的HTML的代码与PHP代码的分 离,使得拥有更好的扩展以及维护。 工作经验 2012/8—2013/4业聚医疗器械(深圳)有限公司技术员 工作感想 之前的公司主要是生产和研发介入性医疗器械的一家公司,我的工作任务主要从事公司导管支架的研发,研发多种不同尺寸型号的球囊扩张导管。在我的工作中,使我学到了很多东西,让我变得更加细心,做事情更加注重细节,更有时间观念等等。 教育经历 2013/4—2013/8达内PHP培训php程序员主要学习了:linux系统常用操作命令,HTML/CSS,Javascript/Jquery/Ajax的前台技术,学习了用Linux系统和Windows系统开发项目,学习了Smarty模板,Zendframework,thinkPHP框架的使用,学习了DEDECMS二次开发。 在学习的过程中,自己独立完成了一个小项目《地球新闻网》,和同学合作完 成了一个商城网站《聚焦购物》,通过这两个项目的实战,为我以后的工作打 下了坚实的基础。 2008/9—2012/7湖北信息工程专修学院电子商务本科主要学习了:计算机应用基础,管理学,电子商务概论,网页设计与制作,电子商务法,商务沟通与谈判及商业职业道德专业课程,安全教育等课程。 通过这些课程的学习,使我对电子商务系统建设与管理打下了良好的基础,同时也使我拥有较强的沟通能力和职业道德水准。 个人评价 1.本人细心,乐观积极心态,吃苦耐劳,勇于挑战自我,热爱学习,喜欢总结; 2.具备良好的团队精神,能很好的与团队协作开发,有良好的沟通能力,喜欢交朋友; 3.性格开朗,阳光,喜欢篮球,游泳,羽毛球等体育运动。 《数据结构与算法》课程学习总结报告 100401200510计本(4)班章兴春 本学期所学习的《数据结构与算法》课程已经告一段落,就其知识点及其掌握情况、学习体会以及对该门课程的教学建议等方面进行学习总结。以便在所学习知识有更深刻的认识。 一、《数据结构与算法》知识点: 学习数据结构之前、一直以为数据结构是一门新的语言、后来才知道学习数据结构是为了更加高效的的组织数据、设计出良好的算法,而算法则是一个程序的灵魂。经过了一学期的数据结构了,在期末之际对其进行总结。首先,学完数据结构我们应该知道数据结构讲的是什么,数据结构课程主要是研究非数值计算的研究的程序设计问题中所出现的计算机处理对象以及它们之间关系和操作的学科。 第一章主要介绍了相关概念,如数据、数据元素、数据类型以及数据结构的定义。其中,数据结构包括逻辑结构、存储结构和运算集合。逻辑结构分为四类:集合型、线性、树形和图形结构,数据元素的存储结构分为:顺序存储、链接存储、索引存储和散列存储四类。最后着重介绍算法性能分析,包括算法的时间性能分析以及算法的空间性能分析。 第二章具体地介绍了顺序表的定义、特点及其主要操作,如查找、插入和删除的实现。需要掌握对它们的性能估计。包括查找算法的平均查找长度,插入与删除算法中的对象平均移动次数。 链表中数据元素的存储不一定是连续的,还可以占用任意的、不连续的物理存储区域。与顺序表相比,链表的插入、删除不需要移动元素,给算法的效率带来较大的提高。链表这一章中介绍了链表的节点结构、静态与动态链表的概念、链表的基本运算(如求表长、插入、查找、删除等)、单链表的建立(头插法和尾插法)以及双向循环链表的定义、结构、功能和基本算法。 第三章介绍了堆栈与队列这两种运算受限制的线性结构。其基本运算方法与顺序表和链表运算方法基本相同,不同的是堆栈须遵循“先进后出”的规则,对堆栈的操作只能在栈顶进行;而队列要遵循“先进先出”的规则,教材中列出了两种结构的相应算法,如入栈、出栈、入队、出队等。在介绍队列时,提出了循环队列的概念,以避免“假溢出”的现象。算法上要求掌握进栈、退栈、取栈顶元素、判栈空盒置空栈等五种操作及掌握使用元素个数计数器及少用一个元素空间来区分队列空、队列满的方法。 第四章串和数组中,我们知道串是一种特殊的线性表,是由零个或多个任意字符组成的字符序列。串的储存结构分为紧缩模式和非紧缩模式。 基本运算需掌握求串长、串赋值、连接操作、求子串、串比较、串定位、串插入、串删除、串替换等。 第五章二叉树的知识是重点内容。在介绍有关概念时,提到了二叉树的性质以及两种特殊的二叉树:完全二叉树和满二叉树。接着介绍二叉树的顺序存储和链接存储以及生成算法。重点介绍二叉树的遍历算法(递归算法、先序、中序和后序遍历非递归算法)和线索二叉树。二叉树的应用:基本算法、哈弗曼树、二叉排序树和堆排序。 树与二叉树是不同的概念。教材介绍了树和森林的概念、遍历和存储结构,还有树、森林和二叉树的相互关系,树或森林怎样转化成二叉树,二叉树又如何转换为树和森林等算法。 第六章介绍了图的概念及其应用,图的存储结构的知识点有:邻接矩阵、邻接表、逆邻接表、十字链表和邻接多重表。图的遍历包括图的深度优先搜索遍历和广度优先搜索遍历。其余知识点有:有向图、连通图、生成树和森林、最短路径问题和有向无环图及其应用。有向无环图重点理解AOV网和拓扑排序及其算法。 最后两章集体说明了查找和排序算法,查找教材上介绍了静态查找表和哈希查找表,静态查找表中介绍了顺序查找、折半查找以及分块查找。哈希法中,学习要点包括哈希函数的比较;解决地址冲突的线性探查法的运用,平均探查次数;解决地址冲突的二次哈希法的运用。 排序是使用最频繁的一类算法,可分为内部排序和外部排序。主要需要理解排序的基本概念,在算法上、需要掌握插入排序(包括直接插入排序算法、折半插入排序算法),交换排序(包括冒泡排序算法、快速排序递归算法),选择排序(包括直接选择排序算法、堆排序算法)等。 二、对各知识点的掌握情况 总体来看,对教材中的知识点理解较为完善,但各个章节均出现有个别知识点较为陌生的现象。现将各个章节出现的知识点理解情况列举如下。 第一章中我对数据和数据结构的概念理解较为透彻,熟悉数据结构的逻辑结构和存储结构。而对算法的时间、空间性能分析较为模糊,尤其是空间性能分析需要加强。 第二章,顺序表的概念、生成算法理解较为清晰,并且熟悉简单顺序查找和二分查找,对分块查找较为含糊;排序问题中,由于冒泡排序在大一C语言课上已经学习过,再来学习感觉很轻松。对插入排序和选择排序理解良好,但是,在实际运用中仍然出现明显不熟练的现象。由于在归并排序学习中感觉较吃力,现在对这种排序方法仍然非常模糊,所以需要花较多的时间来补习。此外串的模式匹配也是较难理解的一个地方。 链表这一章中,除对双向循环链表这一知识点理解困难之外,其他的知识点像单链表的建立和基本算法等都较为熟悉。 接下来的有关堆栈以及队列的知识点比较少,除有关算法较为特殊以外,其余算法都是先前学过的顺序表和链表的知识,加上思想上较为重视,因此这部分内容是我对全书掌握最好的一部分。不足之处仍然表现在算法的性能分析上。 在学习第六章时感觉较为吃力的部分在于矩阵的应用上,尤其对矩阵转置算法的C语言描述不太理解。稀疏矩阵相加算法中,用三元组表实现比较容易理解,对十字链表进行矩阵相加的方法较为陌生。 第七章是全书的重点,却也有一些内容没有完全理解。在第一节基本概念中,二叉树的性质容易懂却很难记忆。对二叉树的存储结构和遍历算法这部分内容掌握较好,能够熟练运用,而对于二叉树应用中的哈弗曼树却比较陌生。 第八章内容较少,牵涉到所学的队列的有关内容,总体来说理解上没有什么困难,问题依旧出现在算法的性能分析上。 散列结构这一章理解比较完善的知识点有:基本概念和存储结构。散列函数中直接定址法和除留余数法学得比较扎实,对数字分析法等方法则感觉较为陌生。对两种冲突处理的算法思想的理解良好,问题在于用C语言描述上。 最后一章,图及其应用中,图的定义、基本运算如图的生成等起初理解有困难,但随着学习深入,对它的概念也逐步明朗起来。邻接矩阵、邻接表和逆邻接表掌握较好,而对十字链表和邻接多重表则较为陌生。感觉理解较为吃力的内容还有图的遍历(包括深度和广度优先遍历),最小生成树问题也是比较陌生的知识点。最短路径和AOV网学习起来感觉比较轻松,而对于C语言描述却又不大明白。 由于平时上机练习的少,对于教材中很多算法都掌握的不是很熟悉、不过这些都是可以弥补的,我会在剩下的时间中不断练习书上给出的算法和练习,正如教材上说的,学习数据结构,仅从书本上学习是不够的,必须经过大量的程序设计实践,在实践中体会构造性思维方法,掌握数据组织与程序设计技术。 三、学习体会: 多做实验!这个就没有太多理由了,我一直觉得编程是一门熟练科学,多编程,水平肯定会提高,最重要的是能够养成一种感觉,就是对程序对算法的敏感,为什么那些牛人看一个算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了过了一阵子又忘记了?其实这个是因为牛人们以前看的程序很多,编得也很多,所以他们有了那种感觉,所以我觉得大家应该多看程序,多写程序,培养自己的感觉。 复习和考试的技巧,我想大家应该都有这样的感觉,就是觉得自己什么都掌握了,但是在考试的时候就是会犯晕,有时候一出考场就知道错在哪个了,然后考完以后一对答案,发现其实考得很简单,应该都是自己会做的,这个就是与自己的复习和考试的技巧有关系了。 首先就是复习,前面已经说过其实我们学的算法也就是几十个,那么我们的任务也就是理解这几十个算法,复习也就是要加深你的理解。如何理解算法,然后理解到什么程度呢? 是能默出整个算法吗?其实不是这样的,数据结构的考试有它的特点,考过程考试了,大家应该都发现数据结构其实不要求你把整个算法背出来,它注重考察你的理解,那么怎么考察呢?其实也就是两种方式吧,一种就是用实例,就是给你一个例子,要你用某个算法运行出结果,我想这个期末考试的时候仍然会有很多这样的题目,比如排序那块就很好出这样的题目,要复习这种题目我觉得很简单,就是每个算法都自己用例子去实践一下,以不变应万变,我期中复习的时候就是这样去做的,而且考试之前我就觉得那个并查集的题目就很有可能会考,于是就自己出了几个例子,做了一下。另外一种考察方式就是算法填空和算法改错,可能有一些同学觉得这种题目很难,其实我们首先可以确定这两种题目肯定是与书上算法有关系的,只要理解了书上的算法就可以了,有人觉得看完书以后什么都懂了,而且要默也默得出来,其实不是这样的,算法改错和填空主要是考察的细微处,虽然你觉得你默得出来,那是能够默出算法的主体部分,很多细微的地方你就会很容易忽略。我想大家考过期中考以后应该都有这种感觉吧?那要怎样解决这种问题呢? 我觉得有两种方法,一种就是自己去编程实现,这种方法比较有意义,还能够提高编程水平,另外一种就是用实例分析算法的每句话,我认为这种方法是最有效的。 然后还有一种题目,就是最后的写算法的题目,我觉得这种题目还是很好解决的,只要是能够自己做出作业的,基本上都会很容易做出来,这也是为什么我前面觉得平时做作业应该自己独立思考的原因,同时做这种题目千万要小心,尤其是题目简单的时候,那肯定会有一些小地方要考虑清楚,一不小心就会被扣掉很多分,这样很不值。 我觉得考试的时候没有太多要讲的,只要复习好了,考试的时候细心一点就可以了,然后就是做一个题目开始就要尽量保证正确,如果觉得留在那里等后面做完了再来检查,这样错误还是很有可能检查不出来,我期中考试的时候就基本上没有检查,因为我做每个题目都是确保正确,用的时间也挺多的,然后也觉得没有检查的必要了。 三、对《数据结构与算法》课程教学的建议 1、建议在上课过程中加大随堂练习的分量,以便学生能当堂消化课堂上学习的知识,也便于及时了解学生对知识点的掌握情况,同时有助于学生保持良好的精神状态。 2、建议在课时允许的情况下,增加习题课的分量,通过课堂的习题讲解,加深对知识点的掌握,同时对各知识点的运用有一个更为直观和具体的认识。 3、要更加重视实验的重要性。 以上便是我对《数据结构与算法》这门课的学习总结,我会抓紧时间将没有吃透的知识点补齐。今后我仍然会继续学习,克服学习中遇到的难关,在打牢基础的前提下向更深入的层面迈进! 《数据结构》教学大纲 一、课程基本信息 课程名称:数据结构 总学时:64(理论课内学时48,上机课内学时16)课程设计:24 课程类型:必修课 考试形式:半开卷考试 讲课对象:计算机本科 建议教材:《数据结构》(C语言版)陈明 编著 清华大学出版社 课程简介:数据结构课程介绍如何组织各种数据在计算机中的存储、传递和转换。内容包括:数组、链接表、栈和队列、串、树与森林、图、排序、查找、索引与散列结构等。课程以结构化程序设计语言C语言作为算法的描述工具,强化数据结构基本知识和结构化程序设计基本能力的双基训练。为后续计算机专业课程的学习打下坚实的基础。 二、课程的教学目标 “数据结构”是计算机相关专业的一门重要专业基础课,是计算机学科的公认主干课。课程内容由数据结构和算法分析初步两部分组成。 数据结构是针对处理大量非数值性程序问题而形成的一门学科,内涵丰富、应用范围广。它既有完整的学科体系和学科深度,又有较强的实践性。通过课程的学习,应使学生理解和掌握各种数据结构(物理结构和逻辑结构)的概念及其有关的算法;熟悉并了解目前常用数据结构在计算机诸多领域中的基本应用。 算法分析强调最基本的算法设计技术和分析方法。要求学生从算法和数据结构的相互依存关系中把握应用算法设计的艺术和技能。 经过上机实习和课程设计的训练,使学生能够编制、调试具有一定难度的中型程序;以培养良好的软件工程习惯和面向对象的软件思维方法。 “数据结构”的前序课是《离散数学》、《C语言程序设计与算法初步》。 三、理论教学内容的基本要求及学时分配 1、序论(2学时)学习目标:熟悉各类文件的特点,构造方法以及如何实现检索,插入和删除等操作。 重点与难点:本章无。 知识点:数据、数据元素、数据结构、数据类型、抽象数据类型、算法及其设计原则、时间复杂度、空间复杂度。 2、线性表(4学时) 学习目标: (1)了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。用前者表示的线性表简称为顺序表,用后者表示的线性表简称为链表; (2)熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储结构上的实现; (3)能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合; (4)结合线性表类型的定义增强对抽象数据类型的理解。 重点与难点:链表是本章的重点和难点。扎实的指针操作和内存动态分配的编程技术是学好本章的基本要求,分清链表中指针 p 和结点 *p 之间的对应关系,区分链表中的头结点、头指针和首元结点的不同所指以及循环链表、双向链表的特点等。 知识点:线性表、顺序表、链表、有序表。 3、栈和队列(4学时) 学习目标: (1)掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们; (2)熟练掌握栈类型的两种实现方法; (3)熟练掌握循环队列和链队列的基本操作实现算法;(4)理解递归算法执行过程中栈的状态变化过程。 重点与难点:栈和队列是在程序设计中被广泛使用的两种线性数据结构,因此本章的学习重点在于掌握这两种结构的特点,以便能在应用问题中正确使用。 知识点:顺序栈、链栈、循环队列、链队列。 4、串(2学时) 学习目标:(1)理解串类型定义中各基本操作的特点,并能正确利用它们进行串的其它操作; (2)理解串类型的各种存储表示方法;(3)理解串匹配的各种算法。 重点和难点:相对于其它各个知识点而言,本章非整个课程的重点,鉴于串已是多数高级语言中已经实现的数据类型,因此本章重点仅在于了解串类型定义中各基本操作的定义以及串的实现方法,并学会利用这些基本操作来实现串的其它操作。本章的难点是理解实现串匹配的KMP算法的思想。 知识点:串的类型定义、串的存储表示、串匹配、KMP算法。 5、数组和广义表(4学时) 学习目标: (1)理解数组类型的特点及其在高级编程语言中的存储表示和实现方法,并掌握数组在“以行为主”的存储表示中的地址计算方法; (2)掌握特殊矩阵的存储压缩表示方法; (3)理解稀疏矩阵的两类存储压缩方法的特点及其适用范围,领会以三元组表示稀疏矩阵时进行矩阵运算所采用的处理方法。 重点和难点:本章重点是学习数组类型的定义及其存储表示。 知识点:数组的类型定义、数组的存储表示、特殊矩阵的压缩存储表示方法、随机稀疏矩阵的压缩存储表示方法。 6、树和二叉树(8学时) 学习目标: (1)领会树和二叉树的类型定义,理解树和二叉树的结构差别;(2)熟记二叉树的主要特性,并掌握它们的证明方法; (3)熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树的其它操作; (4)理解二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法; (5)熟练掌握二叉树和树的各种存储结构及其建立的算法;(6)学会编写实现树的各种操作的算法; (7)了解最优树的特性,掌握建立最优树和赫夫曼编码的方法。 重点和难点:二叉树和树的遍历及其应用是本章的学习重点,而编写实现二叉树和树的各种操作的递归算法也恰是本章的难点所在。 知识点:树的类型定义、二叉树的类型定义、二叉树的存储表示、二叉树的遍历以及其它操作的实现、线索二叉树、树和森林的存储表示、树和森林的遍历以及其它操作的实现、最优树和赫夫曼编码。 7、图(8学时) 学习目标: (1)领会图的类型定义; (2)熟悉图的各种存储结构及其构造算法,了解各种存储结构的特点及其选用原则; (3)熟练掌握图的两种遍历算法;(4)理解各种图的应用问题的算法。 重点和难点:图的应用极为广泛,而且图的各种应用问题的算法都比较经典,因此本章重点在于理解各种图的算法及其应用场合。 知识点:图的类型定义、图的存储表示、图的深度优先搜索遍历和图的广度优先搜索遍历、无向网的最小生成树、最短路径、拓扑排序、关键路径。 8、查找(6学时) 学习目标: (1)理解“查找表”的结构特点以及各种表示方法的适用性;(2)熟练掌握以顺序表或有序表表示静态查找表时的查找方法; (3)熟悉静态查找树的构造方法和查找算法,理解静态查找树和折半查找的关系; (4)熟练掌握二叉查找树的构造和查找方法;(5)理解二叉平衡树的构造过程; (6)熟练掌握哈希表的构造方法,深刻理解哈希表与其它结构的表的实质性的差别; (7)掌握描述查找过程的判定树的构造方法,以及按定义计算各种查找方法在等概率情况下查找成功时的平均查找长度。 重点和难点:本章重点在于理解查找表的结构特点及其各种表示方法的特点和适用场合。 知识点:顺序表、有序表、索引顺序表、静态查找树、二叉查找树、二叉平衡树、哈希表。 9、内部排序(6学时) 学习目标: (1)理解排序的定义和各种排序方法的特点,并能加以灵活应用。排序方法有不同的分类方法,基于“关键字间的比较”进行排序的方法可以按排序过程所依据的不同原则分为插入排序、交换排序、选择排序、归并排序和计数排序等五类; (2)掌握各种排序方法的时间复杂度的分析方法。能从“关键字间的比较次数”分析排序算法的平均情况和最坏情况的时间性能。按平均时间复杂度划分,内部排序可分为三类:O(n2)的简单排序方法,O(n*logn)的高效排序方法和O(d*n)的基数排序方法; (3)理解排序方法“稳定”或“不稳定”的含义,弄清楚在什么情况下要求应用的排序方法必须是稳定的。 重点和难点:希尔排序、快速排序、堆排序和归并排序等高效方法是本章的学习重点和难点。 知识点:排序、直接插入排序、折半插入排序、表插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、2-路归并排序、基数排序、排序方法的综合比较。 10、文件(4学时) 学习目标:熟悉各类文件的特点,构造方法以及如何实现检索,插入和删除等操作。 重点和难点:本章重点在于了解各种文件的结构特点及其适用场合。知识点:顺序文件、索引文件、B-树、B+树、索引顺序文件、VSAM文件、散列文件、多关键字文件。 四、实验教学内容的基本要求及学时分配 1、线性表(1学时)实验一 顺序表的应用 实验二 链表的应用 要求:理解线性表的定义及其运算;理解顺序表和链表的定义,组织形式,结构特征和类型说明;掌握在这两种表上实现的插入,删除和按值查找的算法;了解循环链表,双(循环)链表的结构特点和在其上施加的插入,删除等操作。 2、栈(0.5学时)实验三 栈的应用 要求:理解栈的定义,特征及在其上所定义的基本运算;掌握在两种存储结构上对栈所施加的基本运算的实现。 3、队列(0.5学时)实验四 队列的应用 要求:理解队列的定义,特征及在其上所定义的基本运算;掌握在两种存储结构上对队列所施加的基本运算的实现。 4、串(0.5学时)实验五 串的应用 要求:了解串的定义;理解和领会串的存储方式;掌握常用的串运算。 5、数组和广义表(0.5学时)实验六 稀疏矩阵的应用 要求:理解多维数组的结构特点和在内存中的两种顺序存储方式;理解并掌握矩阵和特殊矩阵元素在存储区中地址的计算;领会稀疏矩阵的压缩方式和简单运算;了解广义表的定义和基本运算。 6、树与二叉树(4学时)实验七 树与二叉树的应用 要求:理解树的定义,术语;领会并掌握树的各种存储结构;熟练掌握森林与二叉树间的相互转换;领会树和森林的遍历;了解树的简单应用。深刻理解二叉树的定义,性质及其存储方法;熟练掌握二叉树的二叉链表存储方式,结点结构和类型定义;理解并掌握二叉树的三种遍历算法;掌握二叉树的线索化方法;灵活运用二叉树的遍历方法解决相关的应用问题。 7、图(3学时)实验八 图的应用 要求:理解图的基本概念及术语;掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法;熟练掌握图的两种遍历(深度优先搜索遍历和广度优先搜索遍历)的算法思想,步骤,并能列出在两种存储结构上按上述两种遍历算法得到的序列;理解最小生成树的概念,能按Prim算法构造最小生成树;领会并掌握拓扑排序,关键路径,最短路径的算法思想。 8、查找(3学时)实验九 顺序查找 实验十 折半查找 实验十一 哈希表的应用 实验十二 二叉排序树的综合练习要求:了解查找的基本思想及查找成功和不成功的概念;掌握在顺序表,有序表,索引表,散列表等上的查找方法和算法,并能求出相应的平均查找长度;理解并掌握二叉排序树,平衡二叉树B-树的各种算法。 9、排序(3学时)实验十三 插入排序 实验十四 选择排序 实验十五 排序综合练习 要求:领会排序的基本思想和基本概念;理解并掌握插入排序,冒泡排序,快速排序,直接选择排序,堆排序,归并排序和基数排序的基本思想,步骤,算法及时空效率分析;了解外排序的定义和基本方法。 五、大纲说明 1、课堂讲述的论题只是核心或有特色的知识内容,还有相当数量的篇章内容留给学生自学,所确定的自学部分内容亦属考查范围。 2、“数据结构”课注重上机训练,所有作业都必须配有规范的文档。上机训练由平时的上机训练和小学期的实训课程设计两部分组成。 3、课内学时安排说明:前8周每周4学时全为理论课,从第9周开始理论和上机为1:1,也即2学时理论,2学时上机训练。 4、本课强调能力的培养,期末采用半开卷考试(允许同学携带一页A4纸的总结资料)。本课成绩由平时作业、上机成绩(30%)和期末考试(70%)合成得到,有独到见解的作业予以适当加分。 5、主要参考书: [1]《数据结构与算法教程》邹永林 周蓓 唐晓阳 杨剑勇 编著 机械工业出版社 [2]《数据结构(C语言版)》(含CD)严蔚敏 吴为民 编著 清华大学出版社 [3]《数据结构习题集(C语言版)》严蔚敏 编著 清华大学出版社 [4]《数据结构习题解析与实训》张世和 编著 清华大学出版社第三篇:PHP程序员
第四篇:数据结构与算法总结
第五篇:数据结构与算法教学大纲