数据结构复习笔记

  • 数据结构

数组

数组是一种顺序式的存储同一类型数据的数据结构。

    声明格式:<数据类型> <变量名称> [ ] = new <数据类型>[ <数组大小>]

链表

  1. 链表是一种有序的列表,串连的方式有两种
    1. 一种是利用数组结构串连的有序列表;如利用含有两个元素的结点构成的数组,一个元素存放数据、另一个元素存放链接关系。
    2. 另一种是以动态内存分配的链表;

    class Node

{

    int Data[ ]=new int[ArraySize];    //用于存储链表的数据

    int Next[ ]=new int[ArraySize];    //用于存储下一个节点的位置

}

Node 变量名称=new Node();

  1. 单链表的基本操作
    1. 插入在链表开头:新的节点插入在链表的开头,需要将新节点的指针指向链表的首节点,并将链表的首节点设为新节点。
    2. 插入在链表中间:新的节点插入在链表的中间,如果我们找到Pointer节点,则需要将新节点的指针指向Pointer节点的指针(即下一个节点),但不能让链表断裂。所以第1步必须将新节点的指针指向Pointer节点的指针、第2步再将Pointer节点的指针指向新节点。
    3. 插入在链表尾端:新的节点插入在链表的尾端(Point节点),所以第1步必须将新节点的指针指向Pointer节点的指针(NULL)、第2步再将Pointer节点的指针指向新节点。
    4. 删除链表首节点:删除的节点在链表的开头,需要将首节点指向首节点的指针(即下一个节点),并将原来的节点从内在中释放。
    5. 删除链表中间节点:删除的节点在链表的中间,如果我们找到Pointer节点,则将前一个节点的指针指向Pointer节点的指针(即下一个节点)。并将原来的节点从内存中释放。
    6. 删除链表尾端的节点:删除的节点在链表的尾端(Pointer节点),如果我们Pointer节点,则需要将前一个节点的指针指向Pointer节点指针(NULL)。并将原来的节点从内存中释放。
    7. 单链表的反转、单链表的反转、双链表、循环链表。
    8. LinkedList类的使用方法,构造方法,类的方法。

堆栈

堆栈数据结构只允许数据自有序列列表的固定端(前端)做输入、输出操作,先进后出。堆栈是一种有序列表。

用数组模拟堆栈,堆栈数组声明:

int stack[MaxSize]; int top=-1;

  1. Stack类的使用、Stack类的方法
  2. 前序、中序、后序表达示的表示法及计算、以及表达式的转换

队列

规定在序列表中的数据的输入、输出是分别由不同端进行处理,具有先进先出的特性。

用数组模拟队列,队列数组声明:

int queue=new int[Maxsize];

int front=-1;    //front会随数据输出而变动

int rear=-1;        //rear会随数据输入而改变

  1. 环状队列

环状队列中的头指针所指向的数组位置并没有内容值存在,,输出的值为front的下一个元素,故环状队列实际上所能使用的空间为MaxSize-1。当尾指针rear等于MaxSize-1时需要回到队列的最前端,故当输入数据时,rear所指的数组元素下标采用这样的计算方法:

( rear + 1 ) mod MaxSize

若尾指针rear不断前进直到等于头指针front时,则表示队列已满,但当队列为空时rear也等于front,为区分这两种状况,必须使用不同的条件来加以判断。

当队列为满:( rear + 1 ) mod MaxSize=front

当队列为空:front = rear

  1. 双向队列
    1. 输入限制性双向队列:是限制只能在队列 的一端(后端)进行输入,而数据的输出则可在队列的两端(前后端)操作
    2. 输出限制性双向队列:是限制只能在队列 的一端(后端)进行输出,而数据的输入则可在队列的两端(前后端)操作

递归

是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象

  1. 数学问题

阶乘问题,最大公因子问题,费氏级数问题,组合公式,汉诺塔问题,N皇后问题,迷宫问题

树状结构

是由一个或多个节点所构成的有限集合。

  1. 二叉树

二叉树中的节点至多只能有两个子节点。

  1. 二叉树的数组表示法
  2. 二叉树的前序、中序、后序遍历
  3. 二叉树的查找、二叉树的节点删除
  4. 一般树转换为二叉树、线索二叉树
  5. 二叉树的应用(表达示)

内部排序

  1. 交换式排序
    1. 冒泡排序:将相邻的两个数据加以比较,若左边的值大于右边的值,则将此两个值互相交换;若左边的值小于等于右边的值,则此两个值的位置不变。右边的值继续和下一个值做比较,重复此操作,直到比较到最后一个值。
    2. 快速排序,步骤为:

    1.从数列中挑出一个元素,称为 "基准"(pivot),

    2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

    3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

  2. 选择式排序
    1. 选择排序法:从欲排序的n个数据中,以线性查找的方法找出最小的元素和第一个元素交换,再从剩下的 ( n-1 )个数据中,找出最小的元素和第二个元素交换,以此类推,直到所有元素均已排序完成。
    2. 堆的外观为完全二叉树的最小或最大树,而堆排序(Heap Sort)所用的堆是"最大堆"。
  3. 插入式排序
  • 插入排序法:假设欲排序的数组元素V1,V2,V3,V4且V3>V2>V4>V1。依序进行插入元素的操作,在每次插入时该元素会放在适当的排序位置,直到最后一个元素插入后,则所有元素排序完成。
  • 希尔排序:将欲排序的数值依某个间隔长度分成数个数列集合,再针对各个数列集合进行"插入法排序",重复进行数列分割,每次分割的间隔长度缩小为上一次分割间隔长度的二分之一,直到分割间隔为零停止。
  • 二叉树排序法:
    • 将欲排序的元素一一以建立二叉树的方式插入,建立二叉树需满足二个条件:
      • 每一个节点最多只有两个子节点( 左节点、右节点 )
      • 若一个节点有子节点,则该节点的数据比左节点的数据大,且比右节点的数据小( 左节点<parent<右节点 )
    • 使用二叉树中序遍历的方式将二叉树的节点打印出来,即可得到元素的排序结果。

外部排序

合并排序法:将欲排序的数据分别存在数个文件大小可加载内存的文件中,再针对各个文件分别使用"内部排序法"将文件中的数据排序好写回文件。再对所有已排序好的文件两两合并,直到所有文件合并成一个文件后,则数据排序完成。

查找

  1. 线性查找
    1. 线性查找又称为顺序查找,在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。
  2. 折半查找
  • 若KeyValue小于Data[middle]:表示KeyValue可能出现在Data[middle]之前,所以查找Data[0]到Data[middle–1]之间的数据。这时left=left,right=middle-1,而middle=( left + right )/2
  • 若KeyValue大于Data[middle]:表示KeyValue可能出现在Data[middle]之后,所以查找Data[middle+1]到Data[n]之间的数据。这时left=middle+1,right=right,而middle=(left + right)/2
  • 若KeyValue等于Data[middle]:表示已查找到数据。
  1. 费氏查找、插补查找、杂凑查找、二叉树查找

复杂链表

  1. 循环链表
  2. 双向链表

图形结构

  1. 概念
  • 无向图形
  • 有向图形
  • 完全图形
  • 了图形
  • 路径
  • 简单路径
  • 回路
  • 连通顶点
  • 连通图形
  • 连通单元
  • 强连通顶点
  • 强连通图形
  • 强连通单元
  1. 图形的表示法
  • 邻接数组表示法
  • 邻接表表示法
  • 多重邻接表表示法
  • 加权边的图形
  1. 图形的搜索
  • 深度优先法
  • 广度优先法
  • 连通组件
  1. 生成树问题
  • 生成树
  • 最小生成树
  • Kruskal算法
  • Prims算法
  1. 最短路径问题

 

 

posted @ 2011-10-21 23:00  维唯为为  阅读(396)  评论(0编辑  收藏  举报