数据结构(临时)

来源:互联网 发布:淘宝ck代购是正品吗 编辑:程序博客网 时间:2024/06/05 03:29

大纲:
数据结构、算法 包括:
线性表:数组、链表
栈,队列
树:二叉树——红黑树、B树

一、什么是数据结构:
1.存储数据
2.对外提供特定的方法

二、线性表
顺序存储:ArrayList、数组
查询公式:a0+(n-1)*位,a
解释:a0表示开始存储的位置,数组中可以选择存在任意下标下。
(n-1)位 n:表示要查询第几个元素,位 表示该数组的类型长度,如int数组:就是32位。

a.数组结构的特点:
1.定长的线性表,元素数目固定,一旦定义了数组就不能再元素上有数量变化
2.数据元素具有相同的类型
3.数组有上下界,且下标有序
数组的运算:
1.给定下标,存取相应的元素
2.给定下标,修改响应的元素

java中的数组都是引用类型 int[] a  数组a 所指向的地址其实就是 a[0]这个地址,        是先找到a[0],需要查找后面的才顺着a[0]的内存地址往后查找

顺序存储:
1.查询快 2.插入删除慢
重点:3.代码规范,初始化要最好要指定大小;
面试:为什么初始化要指定大小。
在内存中,默认大小是10,但是当你要插入的数据超过10时,在内存中并不一定是直接在原有的内存地址上接着添加的。
因为可能你内存中的数组地址 后面已经有其他数据存在,不够你添加.
因为数组的特性是数据相邻,所以会在内存中重新开辟一块足够你添加新元素的内存空间,然后将原先的数组元素copy过来,
这样效率其实并不快,所以在new时,最好指定初始化大小。

链式存储:LinkedList

链式存储结构分为单向链表以及双向链表

链式存储结构与顺序存储结构的不同在于
顺序存储结构每个内存单元只需要存储数据元素便可
链式存储结构不仅要存储数据元素还要存储一个指针
指针:下一个元素的内存地址

单向链表与双向链表的存储又有不同
单向链表存储内存:数据:指针
双向链表存储内存:指针:数据:指针
双向链表比单向链表多存储了一个指针,该指针是指向上一个元素的内存地址

栈,队列:受限的线性表
栈:只能通过“访问它的一端来实现”数据存储和检索的一种线性存储结构
栈的特点:
1:后进先出(先进后出):Last in First Out(简称:LFO)的线性表
2:在栈中进行插入和删除操作的一端称为栈顶,另一端称为栈底
3:不含数据元素的栈称为空栈

栈的基本运算:    1:初始化栈 lnitStack(S):创建一个空栈S    2:判断空栈 StackEmpty(S):当S为空时放回真,否则返回假    3:入栈 Push(S,x):将x元素插入栈顶    4:出栈 Pop(S):将栈顶元素从栈中删除,并返回删除的元素    5:读取栈顶元素Top(S):返回栈顶元素的值栈的分类:    1:栈的顺序存储结构    2:栈的链式存储结构栈的应用:    1:表达式求值,括号匹配等运算在计算机中的实现原理    例子:(1+1+ (1+ (1+1) +1) +1)        栈的运算会把例子的单位按序入栈,当遇到)时便会往前查找(,            匹配到第一个( 便会把 ( ) 之间的元素进行运算并得出值,            然后将( )以及之间的元素出栈,再存入所得出的值。    上面的列子运算过程如:    栈:( 1 + 1 + ( 1 + ( 1 + 1 ) 到此运算变为        ( 1 + 1 + ( 1 + 2 接着入栈后面的元素        ( 1 + 1 + ( 1 + 2 + 1 ) 再运算 变为        ( 1 + 1 + 4 接着入栈后面的元素        ( 1 + 1 + 4 + 1 ) 运算 得出结果为        7     以上便是栈运行的过程,这里不方便画图,     看的时候把例子的运算竖着写更容易理解栈结构    2:递归过程转变非递归过程的处理    简单说下:程序运行时也是栈结构,方法入栈,结束出栈,可以deBUG看下,          异常的try catch 也是,由于栈的特点,看异常信息时,其实应该从最底下往上看    另外java 中有一个 Stack类,也就是栈,该类使用了 synchronization 修饰,是同步的,    效率低,最大的毛病是它的父类 Vector,Vector该类存在对容器任意位置操作的public方法    所以 Stack 类也继承了父类的方法,导致该类不能算是一个纯粹的栈结构,基本不用队列:    队列是一种先进先出(First in First Out , FIFO) 的线性表,    它只允许在表的一端插入元素,而在表的另一端获取(删除)元素。    在队列中,允许插入元素的一端成为队尾(rear),    允许删除元素的一端成为队头(tront)。队列的分类:    1:队列的顺序存储结构:比如循环队列(约瑟夫环)    2:队列的链式存储结构:比如双端队列队列的基本运算:    1.初始化队列:lnitQueue(Q):创建一个空的队列    2.判断空队列 Empty(Q):当Q为空的时候返回真,否则返回假    3.入队列 EnQueue(Q,x):将元素x插入队列Q的尾部,更新队尾指针    4.出队列 DeQueue(Q):将队列头元素从队列Q中删除,更新队头指针(注意,顺序队列与链式队列的不同)    5.读取队列头元素 FornQueue(Q):返回队列头元素的值队列的应用:    优先级队列:将优先的任务定在队头,按优先度排序    。。。。。。。。。。。