天天看点

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

这几天看了java的数据结构相关,深有感触,也因此接触到了堆栈 ,表,队列等储存结构,它们分别都有相应的顺序结构和离散结构,我打算针对这些内容写一个系列专题博客吧

我是第一次在csdn写博客,可能有地方会有疏漏或错误,还请各位大神大牛指出,不吝赐教,我深表感谢!!!

我一开始想着用一篇博文就讲完所有问题,但是在写的过程当中发现,这几乎不可能,所以,我把我想说的内容拆分了,整合成一个相关专题

另外提一下,我是看了这篇博客才有头绪写的,非常感谢该篇博客的博主。

这里我就搬运链接过来了

java数据结构 :http://blog.csdn.net/amork/article/details/7258216

废话不多说,进入正题…..

数组

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

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

数组包含以下特点

1、插入和删除一个元素的时间复杂度为O(n)。

2、支持随机访问,顺序表读取一个元素的时间复杂度为O(1)。

3、优点是:支持随机访问,空间利用率高。

4、缺点是:大小固定,插入和删除元素需要移动大量的数据。

链表

链式存储结构是基于指针实现的。我们把一个数据元素和一个指针称为结点。

链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来。链式存储结构的线性表称为链表。

根据链表的构造方式的不同可以分为:

1、单向链表

2、单向循环链表

3、双向循环链表

单链表

所谓单链表,就是构成链表的每个结点只有一个指向直接后继结点的指针。

如图所示:

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

单链表有带头结点结构和不带头结点结构两种。

我们把指向单链表的指针称为单链表的头指针。

头指针所指的不存放数据元素的第一个结点称作头结点。

存放第一个数据元素的结点称作第一个数据元素结点,或称首元结点。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

链表进行增加元素操作如下图所示

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

要在第一个数据元素结点前插入一个新结点,若采用不带头结点的单链表结构,则结点插入后,头指针head就要等于新插入结点s,这和在非第一个数据元素结点前插入结点时的情况不同。

另外,还有一些不同情况需要考虑。

因此,算法对这两种情况就要分别设计实现方法。

单向循环链表

和单链表相同,循环单链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除操作时,算法实现较为方便。

带头结点的循环单链表结构如下:

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

双向循环链表

双向链表是每个结点除后继指针外还有一个前驱指针。和单链表类同,双向链表也有带头结点结构和不带头结点结构两种,带头结点的双向链表更为常用;另外,双向链表也可以有循环和非循环两种结构,循环结构的双向链表更为常用。

在双向链表中,每个结点包括三个域,分别是element域、next域和prior域,其中element域为数据元素域,next域为指向后继结点的对象引用,prior域为指向前驱结点的对象引用。下图为双向链表结点的图示结构。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

带头结点的循环双向链表的图示结构。循环双向链表的next和prior各自构成自己的循环单链表。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

设对象引用p表示双向链表中的第i个结点,

则p.next表示第i+1个结点,p.next.prior仍表示第i个结点,

即p.next.prior == p;

同样地,p.prior表示第i-1个结点,p.prior.next仍表示第i个结点,

即p.prior.next == p。

假设需要在双向循环链表当中插入元素x,

X的位置在p之前,

即第i-1个节点和第i个节点之间插入

第i-1个节点的后继指针指向x,

X的前驱指针指向第i-1个节点

X节点的后继指针指向第i个节点

第1个节点的前驱指针指向x

下图是双向链表上述关系的图示:

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

循环双向链表的删除过程如下图所示。图中的指针p表示要插入结点的位置,①、②表示实现删除过程的步骤。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

堆栈

堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作。

堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

从输入和输出数据元素的位置关系看,堆栈的功能和一种火车调度装置的功能类同。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

队列

队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作。

队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头。队列的插入操作通常称作入队列,队列的删除操作通常称作出队列。

下图是一个依次向队列中插入数据元素a0,a1,…,an-1后的示意图,其中,a0是当前队头数据元素,an-1是当前队尾数据元素。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

顺序队列的存储结构

下图是一个有6个存储空间的顺序队列的动态示意图,图中front指示队头,rear指示队尾。

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

队列也有其相应的链式结构

链式存储结构的队列称作链式队列

java数据结构链表,堆栈,队列,串相关专题分析与扯谈-概述

串结构

串(也称作字符串)是由n(n≥0)个字符组成的有限序列。

一个串中任意个连续的字符组成的子序列称为该串的子串。

包含子串的串称为该子串的主串。

一个字符在一个串中的位置序号(为大于等于0的正整数)称为该字符在串中的位置。

当且仅当这两个串的值完全相等时,称这两个串相等。

串的顺序存储结构

串的顺序存储结构就是用字符类型数组存放串的所有字符。表示串的长度通常有两种方法:

(1)设置一个串的长度参数。

(2)在串值的末尾添加结束标记。

串的链式存储结构

串的链式存储结构就是把串值分别存放在构成链表的若干个结点的数据元素域上。 有单字符结点链和块链两种。

单字符结点链就是每个结点的数据元素域只包括一个字符。

块链就是每个结点的数据元素域包括若干个字符。

基本的就讲到这里,下一篇开始则使用代码的形式讲述链表

继续阅读