数组、链表、堆栈和队列、线性表和顺序表

  • 线性表是具有n个(数据元素)的有限序列(n>0)
  • 数据:信息的载体,能够被计算机识别、存储、加工,包括整数、实数、字符串、图像、声音等
    数据元素: 数据的基本单位,也称结点、元素、 顶点(图)、记录。 一个数据元素可由若干个数据项组成,比如线性表中每个数据元素由姓名、性别、年龄三个数据项组成 
    数据项:是具有独立寒意的最小标识单元,也称字段、域、属性等
    数据结构:指数据之间的相互关系,即组织形式,有逻辑结构(一般程序中出现的形式)和物理结构之分(内存中的连续存储形式);逻辑结构又有线性(非空,仅由一个开始结点和一个终端结点,除首尾结点之外,所有节点均只有一个直接前区和一个直接后继,如一维数组、栈、队列、链表、串等)和非线性之分(一个结点可以有多个直接前区和多个直接后继,如多维数组、广义表、树、图等) 



转自http://blog.csdn.net/amork/article/details/7258216

数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据结构就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出的逻辑结构,栈是一种先进后出的逻辑结构,家谱是一种树形的逻辑结构!(初学数据结构的时候很不理解为什么有“栈”这个东西;队列很容易理解---无论购物就餐都需要排队;栈可以认为就是个栈道---只允许一个人通过的小道,而且只能从一端进入,然后再从这端返回,比如你推了个箱子进去啦,第二个人也推个箱子进去,此时只能等后进来的这个人拉着箱子出去后,你才能退出。)

数据存储结构:它是计算机的一个概念,简单讲,就是描述数据在计算机中存储方式的学科;常用的数据存储方式就两种:顺序存储,非顺序存储!顺序存储就是把数据存储在一块连续的存储介质(比如硬盘或内存)上----举个例子:从内存中拿出第100个字节到1000个字节间的连续位置,存储数据;数组就是典型的顺序存储!非顺序存储就是各个数据不一定存在一个连续的位置上,只要每个数据知道它前面的数据和后面的数据,就能把所有数据连续起来啦;链表就是典型的非顺序存储啦!


数组、链表、堆栈和队列是最基本的数据结构,任何程序都会涉及到其中的一种或多种。

顺序存储结构的应用:下标表示指针,存储树状结构。图的邻接矩阵。可存储线性或非线性结构。

 

数组

     数组是最最基本的数据结构,很多语言都内置支持数组。数组是使用一块连续的内存空间保存数据,保存的数据的个数在分配内存的时候就是确定的:

 

图 1.1 包含 n 个数据的数组

     访问数组中第 个数据的时间花费是 O(1) 但是要在数组中查找一个指定的数据则是 O(N)。当向数组中插入或者删除数据的时候,最好的情况是在数组的末尾进行操作,时间复杂度是O(1) ,但是最坏情况是插入或者删除第一个数据,时间复杂度是 O(N) 。在数组的任意位置插入或者删除数据的时候,后面的数据全部需要移动,移动的数据还是和数据个数有关所以总体的时间复杂度仍然是 O(N) 

 

图 1.2 向数组中插入数据

 

链表

     链表是在非连续的内存单元中保存数据,并且通过指针将各个内存单元链接在一起,最有一个节点的指针指向 NULL 。链表不需要提前分配固定大小存储空间,当需要存储数据的时候分配一块内存并将这块内存插入链表中。

     在链表中查找第 个数据以及查找指定的数据的时间复杂度是 O(N) ,但是插入和删除数据的时间复杂度是 O(1) ,因为只需要调整指针就可以:

 

图 2.1 链表

 

图 2.2 向链表中插入一个数据

 

图 2.3 从链表中删除一个数据

     向上面这样的链表结构在插入和删除的时候编程会比较困难,因为需要记住当前节点的前一个节点,这样才能完成插入和删除。为了简便通常使用带有头节点的链表:

 

图 2.4 带有头节点的单链表

     上面的链表是单链表,此外还有双链表,就是节点中包含指向下一个节点的指针和指向上一个节点的指针:

 

 2.5 双向链表

     不带有头节点的双向链表在插入和删除数据的时候也不会出现单链表那样的问题。此外还有一种链表是循环链表,它是将双向链表的头尾相接:

 

图 2.6 双向循环链表

     向循环双向链表和循环链表中插入或者从中删除数据只是多移动几个指针。

设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用(带头结点的双循环链表)最节省时间。

  • 首先总在末位操作。所以使用循环链表。
    又因为要执行删除操作。若使用单循环链表,例如对....->X->Y>Z->...,Y删除后无法一步访问X。若双循环链表,可向回访问。 

 

堆栈

     堆栈实现了一种后进先出的语义 (LIFO) 。可以使用数组或者是链表来实现它:

 

图 3.1 堆栈

     对于堆栈中的数据的所有操作都是在栈的顶部完成的,只可以查看栈顶部的数据,只能够向栈的顶部压入数据,也只能从栈的顶部弹出数据。

 

队列

   (1)  队列实现了先入先出的语义 (FIFO) 。队列也可以使用数组和链表来实现:

 

图 4.1 队列

        队列只允许在队尾添加数据,在队头删除数据。但是可以查看队头和队尾的数据。还有一种是双端队列,在两端都可以插入和删除:

 

图 4.2 双端队列


(2)循环队列的相关条件和公式


队尾指针是rear ,队头指针是front,其中QueueSize为循环队列的最大长度

2.1 队空条件:rear==front

2.2 队满条件:(rear+1)%QueueSize==front

2.3 计算队列长度: (rear-front+QueueSize)%QueueSize

2.4 入队 :(rear+1)%QueueSize

2.5 出队:(front+1)%QueueSize


(3)循环队列的存储结构

循环队列是队列的一种顺序存储结构吗

是的····顺序存储就是指用一组连续的存储单元依次存储,链式存储内存中地址不是挨着的,循环队列增设了两个指针头指针和尾指针,实现空间的最大利用



5、线性表和顺序表

线性表是逻辑概念,只要所有的数据在逻辑上是一维的都可以认为是线性表。线性表包括顺序表(栈,队列等),链表(栈,队列等)。跟线性表相对的概念应该是树或者堆。
 
顺序表是空间概念,指的是所有的数据在存储空间上顺序排列,而跟具体的操作方式无关。与顺序表相对的概念只有链表。

你可能感兴趣的:(数据结构)