这是我的第一篇博客
未完(开始于2020/7/17- )
大家好! 本人新手一枚。从一个小白,自学两年,到现在开始从事开发工作,一路走过多少艰辛与歧途, 只有自己知道。一路碰撞,请教各路大神,总结了一些自己的学习方法。从初学者的角度特进行整理。(本文不是严肃的科学论文,一些概念未按照教科书严格描述,一些抽象的概念我具体化了,又加上我的理解,所以可能不太准确,欢迎大家批评指正,我经历了学习这些的痛苦,所以我希望能把这个做成一个通俗、易懂、易入门的学习文章)
数据结构
把数据元素比作糖,数据元素的集合比作糖盒
数据结构就是形容糖与糖盒的关系(糖放在糖盒里)和运算(怎么放,取,整理)。在数据结构中,糖与糖之间的相互关系称为数据的 逻辑结构。按照逻辑关系的不同将数据结构分为线性结构(把糖摆成一条线)和非线性结构(把糖摆成平面或立体图形),其中,线性结构包括线性表、栈、队列、串,非线性结构主要包括树和图。数据元素及元素之间关系的存储形式称为存储结构,有顺序存储(把糖放在什么位置,在什么位置可以拿到)和链接存储(把糖扔进盒子里,盒子按照自己的规则放置)两种基本方式。
算法对给定问题的求解过程进行描述,设计合理的数据结构可使算法的实现简单而高效。
线性结构
线性结构是元素之间的一种线性关系(一个接一个排列),每个元素与前面和后面的元素有关系
线性结构可以分为三类,线性表、栈和队列、串
线性表
线性表是最基本的一种线性结构,主要的操作是增(插入),删(删除),查(查找),储存方式常采用顺序储存和链式储存
顺序储存:用一组连续的储存单元,依次存储线性表中数据元素,从而使相邻的两个元素物理存储位置也相邻,下图用表格表示物理存储单元(我们都知道是有开关,即0/1存储,就当一个单元格是一个开关),染色的一个格表示元素(一个元素用很多开关存储,每个元素用的开关个数相同),下图可以认为是一个线性表顺序存储的示意图。
那么我们在来说一说他的增、删、查的过程:
先说一下增的过程,比如要在1后面加个元素,就要先把2-8,从8开始向后挪一位,动了7次,把2的位置空出来,在2的位置上加一个新的值,过程如下图
我们在来说一下删的过程,比如删除2,先把2删除,在把3-8,从3开始依次向前移动一次,过程如下图
在来说说查的过程,查比较简单,我就不画图了(我也不知道怎么画),说一下过程,首先找到第一个位置,知道位置和大小,比如想取第4个,就可以计算出4元素的地址(准确说是指针,为了更好理解,后面就说是地址)。可以一次就查到。
所以说线性结构顺序存储的特点是增删慢,查询快
链式储存:顺序储存是在内存上开了一块紧密相连的空间,而链式储存就是你可以将元素紧密存放,也可以存放在不相连的位置,通过线(指针/地址)相连在一起。这个线是怎么实现的呢?就上一个元素上存放了两个东西,一个是数据(数据域),一个是地址(指针域)。这个地址不该数据的地址,而是指向其它数据的地址,如下图,数据代表地址,字母代表值。蓝色和红色是地址(指针域)和数据(数据域)上面的无色数字表示数据存放的真实地址,我们看第一个地址是0的,指针域地址指向1,1指向2,2指向4,4指向3,这样就把存放在不同位置的数据串成一条线。
从上图也可以看两个明显的特征
1 .1,2,3在一起,0,4并没有在一起,说明链式结构可以在内存存在一起,也可以不在在一起
2 .1存放的地址指向2,2指向4,4指向3,地址指向什么并没有限制。
我们在来看看它的增、删、查吧!
看上图,你可以把2删了,也可以在空白的地方在加一个地址用5表示的数据,删除的时候要更改与它相关的数据的指针。1指向2,2指向4,把1的指向改在4,把5加在0后面,把0的指针改向5,5的指针改成1.如果你要查4,你必须从0开始查,0-1-2-4.
所在链表的特点是增删快,查询慢
链式储存根据储存和指向又分为单链表、双向链表、循环链表、静态链表。
类型 | 特点 | 优点 |
---|---|---|
单链表: | 指针域有一个指针,指向下个元素 | 增删快 |
双向链表 | 指针域有两个指针,一个指向上个元素,一个指向下个元素 | 可以从前往后查,也可以从后往前查 |
循环链表 | 最后一个元素指向第一个元素 | 从任意一个元素的位置都能查到全部的数据 |
静态链表 | 所有的元素相邻存放在一起(顺序储存的特点)且有指针(链式储存的特点) | 增、删、查都快 |
栈和队列
栈和队列是程序中常用的两种结构,他们的 逻辑结构 与线性表相同,特点在与运算受到了限制。栈,后进先出,队列,先进先出。具体点说呢,你把栈当成杯子,队列当成管子。杯子里放糖,先放的被后放的压在下面,要等上面的拿完在能拿到,管子里放糖,先放的先滑出来,后放的后滑出来。
栈和队列都有顺序结构和链式结构,上线性表的基本一样,顺序结构长度固定,链式结构存储指针实现可增加长度。
队列的顺序结构有个循环队列,就是把管子接成个环,当没有元素时,队头和队尾地址一样,当队列元素满了时,队头和队尾地址也一样,这样可以简化操作。简化判断是不是满队列的操作,两种方式,一种是加一个标识,当队头地址等于队尾地址时可判断是满是空,二,牺牲一个储存单元(这个单元不在储存内容),当队尾的下一个地址是队头,认为队列满。
重点说下栈和队的应用:
栈的典型应用包括表达式求值、括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。队列常用于需要排队的,如打印,离散事件的计算机机模拟。后面说算法时会具体说的。
数组
数组(Array)是 有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标()。
数组是用于储存多个相同类型数据的集合。