兵书,是对大量战争指挥经验的总结。
数据结构,是对大量程序编写经验的总结。
一些程序(比如学生成绩管理系统),处理的数据用数组、链表存储;一些数据比如组织机构、家谱数据、硬盘文件组织等,要用树形结构处理;一些数据,比如地图等,要用图形结构处理。
因此,会了线性结构、树形结构、图形结构的共性知识,就可以做到四两拨千斤。
对于学生,要按照自己的上大学的目的来学习:
1、只想混个及格的,了解各种结构的思想即可,不需要会编程;
2、想要考计算机专业研究生的,要了解思想,会写算法源代码;
3、想从事软件开发工作的,不仅要了解思想,还要会编程序实现,还要选择一门语言,会调用现成的数据结构并懂其原理。
对于老师,一般是按照上面(2)来讲授课程,以(3)来引导学生。
在实际中,一般的数据结构都能在各种语言中得以实现,一般的程序员是数据结构的使用者。只有当问题比较特殊,当前的数据结构不能满足需求时,才需要去设计数据结构。
所以程序员的兼有用户和开发者的双重角色,使用库函数、现成数据结构、第三方插件时就是用户,而作为软件的制造者,他又是开发者。
一、顺序表
就是能够自动增加空间和自动缩小空间的数组。
1、看书
大学是一个系统的学习某个学科或者专业的过程,一定要能沉下心来看书。
纸质书的好处是能随身携带,不用担心没有电,而且对眼睛损害小。
对于比较厚的书,可以按照章节裁开,更容易携带。
初次进入专业,肯定会有比较多的名词不熟悉,就要去查百度、问知乎,
理解后,用自己的语言做好批注。
对于数据结构这门课,是计算机专业核心课程,考研课程,牛*企业笔试面试必考知识,更需要仔细阅读。
2、一维数组
优点:在内存中占据连续空间,能够按照下标存取数据,速度快;
缺点:一旦定义后,所占据内存大小不能改变。
3、一维动态数组
优点:有需求时向操作系统申请空间,有一定的灵活性;
缺点:向操作系统申请空间的时间开销比较大。
4、c++模板vector、C#的List、Java的ArrayList、python的List等。
这些都是基于一维动态数组实现的,因为这些语言都是面向对象语言,因此顺序表就被表示成模板的形式,可以支持泛型编程。
5、顺序表的增删改查等基本操作
在顺序表中增删改查后,不能改变数据的线性关系。
6、将传统数据结构教材上的查找、排序内容移动到此处。
二、链表
1、看书
2、单链表
3、双向链表
4、循环链表
5、c++模板list、C#的LinkList等。
6、各种结构的增删改查、排序等基本操作
三、栈
1、看书
2、基于顺序表的栈
3、基于链表的栈
4、C++模板的stack,其他语言的stack
5、栈的入栈、出栈、得到栈顶元素等操作
四、队列
1、看书
2、基于顺序表的队列
3、基于链表的队列
4、C++模板的queue,其他语言的queue
5、队列的入队、出队、得到队头元素等操作
五、字符串
1、看书
2、基于顺序表的字符串
3、基于链表的字符串
4、C++模板的String,其他语言的String
5、串的连接、拷贝、比较等操作
六、二叉树
1、看书
2、基于数组的二叉树
3、基于二叉链表、三叉链表的二叉树
4、基于伪指针的二叉树
5、二叉排序树、平衡二叉树、红黑树、B-树
6、二叉树的前序、中序、后序、层序遍历
七、树和森林
1、看书
2、树、森林的存储结构
3、树和森林的遍历
4、等价类、并查集
八、图
1、看书
2、图的邻接矩阵存储结构
3、图的邻接表存储结构
4、图的深度优先、广度优先遍历算法
5、图的最小生成树算法,Prim和Kruscal
6、图的最短路径算法,Dijkstra和Floyd
7、拓扑排序
九、哈希表
1、看书
2、哈希表概念、原理、哈希函数
3、C++中的HashTable模板,其他语言的哈希表类