浅谈C++容器(二)

文章转载自blog.csdn.net/acosoft  

文章主要从宏观层面对容器进行了分类讲解,大牛请直接无视本文。

 

上面从整体上说明了数据结构的概念和分类,下面就具体的几种常用的数据结构作以说明。

线性表

数据结构中最简单最基本的结构是线性表 。线性表是相同类型的数据元素的有限序列,数据元素之间具有顺序关系。从数据的存储结构上线性表可以分为顺序表和链表两类。顺序表即是对线性结构使用顺序存储结构的方式,链表即是对线性结构使用链式存储结构的方式。其两者的特点就是逻辑的线性结构对不同存储结构的实现。顺序表是一组连续的存储单元顺序存放的线性的数据元素,数据元素在内存的物理存储次序与他们在线性表中的逻辑次序是一致的。链表是将线性的数据元素存放在节点上,节点包含数据元素和指针,指针保存了各节点元素之间的逻辑关系。这些节点有逻辑上的次序关系,但在存储结构中没有次序关系,即在内存中没有在连续的存储单元。从其存储特点上看,顺序表检索性能非常好,因为它存储在连续的内存块中,而链表的插入和删除性能非常好,因为它在内存中操作一个元素不会影响到其它任何元素。

栈(stack)

栈是一种特殊的线性表。其插入和删除只允许在线性表的一端进行。允许操作的一端称为栈顶,不允许操作的一端称为栈底。由于栈的特点,每次插入或删除都是操作最后的元素,所以栈是“后进先出”表。

栈同样可以用顺序存储和链式存储两种方式实现,所以栈又分为顺序栈和链式栈。

队列(queue )

队列是一种特殊的线性表,其插入和删除操作分别在线性表的两端进行。其特点是当前出对的数据元素一定是队列中最先入队的元素,所以队列又称“先进先出”表。

同栈一样,队列分为顺序队列和链式队列。顺序队列又分为普通顺序队列和顺序循环队列。

优先级队列

优先级队列是队列的一种形式,它是对每次插入队列后的数据按某种规则进行排序,每次删除的均是优先级最高的数据元素。

树结构是数据元素之间具有层次关系的非线性结构。除根节点外,树结构中每个数据元素只有一个前驱元素,可有零个或若干个后继元素,根节点没有前驱元素。

树结构主要分树和二叉树两种。

二叉树

二叉树是树结构的一种特殊形式,它最多只有两个子树、且两个子树是有左右之分的有序树。二叉树是严格有序的树,即使只有一个子树也要区分左子树和右子树。对于子树相同但左右结构不相同的二叉树是不同的两个二叉树。

堆是二叉树的特殊形式。二叉树有两种特殊形式,满二叉树和完全二叉树。满二叉树是每个节点的值都达到最大值。完全二叉树是最下面一层可以不满,其上各层是满的二叉树。除此以外,完全二叉树最下面一层的节点都集中在该层最左边的若干位置上。

堆属于完全二叉树,但堆是有序的完全二叉树,在堆二叉树中,任意一个节点的关键字值都小于或大于它的子节点的关键字值。根节点最大的堆叫大顶堆,根节点最小的对叫小顶堆。

图是数据结构里比较复杂的一种结构,在C++ 通用容器中也没有包含到,在这里只做简单的介绍。图是一种非线性结构,它不像线性表的数据元素之间那样仅有顺序关系,也不像树结构的数据元素之间那样存在层次关系,在图结构中,数据元素之间的关系没有限制,任意两个元素之间都可以相邻,每个元素都可以有多个前驱元素和多个后继元素。

数组、矩阵

数组是一组相同数据类型的数据元素的集合,数组元素按次序存储在一个地址连续的内存空间中。数组元素在数组中的位置称为数组的下标,通过下标可以找到存放数组元素的存储地址,从而访问数组元素值。

数组中最简单的是一维数组。一维数组可以看成一个顺序存储结构的线性表。二维数据定义为“其数据元素为一维数组”的线性表。矩阵一般采用二维数组存储。

广义表

广义表是n 个数据元素组成的有限序列。同数组不一样,它的每一个元素可以是不同的数据类型或数据结构,可以是一个不可分的元素,也可以是一个复杂的数据结构甚至可以是一个广义表。如果广义表的子表是其自身,则称该广义表为递归表。

广义表是一种线性结构,其数据元素之间有线性的固定的次序关系,但它不等于线性表,仅当其数据元素全部是原子元素时才等价于线性表。所以说广义表是线性表的扩展,而线性表是广义表的特例。

广义表也是一种多层次结构,当广义表的数据元素中包含子表时,该广义表就是一种多层次的结构。

所以广义表可以是线性结构也可以是非线性结构,它既可以表示简单的线性结构,也可以表示树、图等复杂的非线性结构。它是数据结构的一种综合形式。按存储方式分广义表可以分为顺序存储和链式存储两种方式。

点赞