1.栈(stack)
栈遵循的是一种后进先出(Last-In First-Out)的策略,每次执行删除操作只能删除最近插入的元素。
举个简单的例子,就好像桶装薯片,工厂装薯片的时候最先装进去的薯片肯定压在最低下,最上面的薯片一定是最后才装进去的。
你吃薯片的时候,一定也是从最上面开始拿,不拿走最上面的薯片,你是没有办法拿到处在下层的薯片的。
栈的典型操作
1.PUSH:将元素压入栈中
2.POP:将顶层元素删除
栈的状态
1.栈中不包含任何元素,栈是 ”空”(Empty) 的
2.试图对一个空栈执行POP操作,称为栈下溢(Underflow)
3.试图对一个已经装满的栈执行PUSH操作,称为栈上溢(Overflow)
2.队列(queue)
队列遵循的是一种先进先出(First-in First-out)的策略,被删除的元素总是在队列中存在时间最长的元素。
这就好像平时排队咨询一样,最先来到咨询处的人最早离开队列,站在队列前面的人没有离开,后面的人也无法接受服务(咨询,咨询完离开)。
队列的典型操作
1.ENQUEUE:将元素从插入队列队尾(tail)
2.DEQUEUE:将最队头(head)元素从队列删除
3.链表(linked list)
链表中各对象按线性顺序排列,其顺序由各个对象里的指针决定。
举个不太恰当的例子,一串珍珠项链,它有两部分,一部分是一颗颗珍珠,剩下的是线,线有点像指针,我们通过线,把一颗颗珍珠连在一起,假如每颗珍珠都是不同的,我们的珍珠项链穿好后,他们的顺序就确定了。
双向链表(doubly linked list)
链表中每个元素都是一个对象,对象中包含一个关键字key(对象存储的值)和两个指针:next(指向下一个元素) 和 prev(指向前一个元素)
链表头的prev指向空,尾的next指向空。
单向链表(singly linked)
跟双向链表的区别仅在于它没有prev指针
循环链表(circular list)
一般来讲是通过双向链表来实现。
表头的prev指针指向表尾元素,表尾的next指针指向表头元素。
链表的搜索
链表搜索一般采用简单的线性搜索方法,当要找链表中是否存在某个元素关键字为k时,对于单项链表,我们只得从头开始遍历查找,而对于双向链表,其允许从末尾开始查找。
要搜索一个具有n个对象的链表时,最差情况为遍历整个链表,时间复杂度为o(n)。
链表的插入与删除
如果要插入一个新的元素到某个关键字为k的元素前或者后,或者要删除某个关键字为k的元素,首先需要进行搜索,再进行插入删除操作,要注意插入删除位置前后元素的指针next以及prev要相应发生变化。
4.树(tree)
树是一种分级的抽象数据类型,数据按照父节点(parent),子节点(children)关系依存。
树中的每个节点至多有1个父节点,但可以有0个或者更多子节点。
每个树都会有一个根节点(root),它没有父节点,但除它以外的节点有且只有一个父节点。
树可以被递归的定义:一个树可以由若干个子节点作为根的子树(subtree)组成。
关于树的一些概念
1.根节点(root)
2.父节点(parent)
3.子节点(children)
4.兄弟节点(sibling):具有相同父节点的子节点称为兄弟节点
5.内部节点(internal nodes):所有具有子节点的节点
6.终端节点(叶节点)(external nodes):所有不具有子节点的节点
7.祖先(acestor):一个节点的父节点,及其父节点的祖先,被称为这个节点的祖先
8.后代(descendent):一个节点的所有子节点,及其所有子节点的后代,称为这个节点的后代
9.深度(depth):一个节点祖先的个数,称为其深度
10.度(degre):一个节点子节点的个数,称为其度
11.树的高度(Height of a tree):其所有外部节点中最大的深度
12.节点的高度(Height of a node):外部节点的高度为0,内部节点的高度为其子节点中最大高度值+1
13.子树:有根树的其中一个子节点及其所有后代所构成的树,称为这个有根树的子树
特殊的树之二叉树
所有节点至多有两个子节点(degree 2)
每个子节点被标记为左子节点(left child)或右子节点(right child)
完美二叉树:其所有节点的度为0或2
二叉搜索树:所有内部节点都具有值,一个节点所有构成其左子树的节点的值,均小于该节点的值,而所有构成其右子树的节点的值,均大于该节点的值。
5.图(graph)
图由若干个被边(edge)连接的顶点(vertice)组成。
图可以由一对边集合和顶点集合表示:(V,E)
V表示顶点集合,E表示边集合,边集合中的元素由一对顶点表示:(v,e)- - -顶点v和顶点e
关于图的一些概念
1.有向边(directed edge):有顺序之分的一对顶点(u,v),第一个顶点表示起始点,第二个顶点表示目的地
2.无向边(undirected edge):无顺序之分的一对顶点(u,v)
3. 路径(path):一个由顶点和边交错的序列,序列开始于一个顶点,结束于一个顶点
4. 简单路径(simple path):其序列中所有的边以及点都是唯一的(不存在重复的点以及边)
5.度(degree):一个顶点的度指有几条边与其相连
6.入度(in-degree):对于一个有向图来说,一个顶点的入度等于有多少与其相连的边指向这个顶点(以其作为目的地)
7.出度(out-degree):对于一个有向图来说,一个顶点的出度等于有多少与其相连的边从这个顶点指出(以其作为起始点)
注:对于有向图来说,一个顶点入度的值加上出度的值等于它的度
8.平行边(paralle edge):如果两条边为平行边,那么他们连接相同的顶点
9.自环(self-loop):一条边如果是自环,那么它的端点是同一个顶点
10.圈(cycle):一个交替由顶点和边组成的循环序列叫做圈
11.简单圈(simple cycle):圈中所有的顶点和边都是唯一的,无重复
12.有向图(directed graph):所有的边都是有向的
13.无向图(undirected graph):所有的边都是无向的
14.子图(subgraph):我们说S是G的子图,当S中所有的顶点,是G中顶点的子集,S中所有的边是G中边的子集
15.生成子图(spanning subgraph):一个图的生成子图包含这个图所有的顶点
16.连通图(connected graph):如果一个图每一对顶点都有一条路径将它们相连,则称它为连通图
17.连通分量(connected component):一个非连通图的连通分量指其连通的子图
18.树(tree):树是一个无向图,而且它是连通的,不存在圈
19.森林(forest):深林是一个不存在圈的无向图,森林中的连通分量是树(也就是说单个的树是一种特殊的森林)