XBOX

  PHP博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  13 随笔 :: 87 文章 :: 0 评论 :: 0 Trackbacks
 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率的算法。数据结构往往同高效的检索算法和索引技术有关。

数据结构在计算机科学界至今没有标准的定义。个人根据各自的理解而有不同的表述方法:

Sartaj Sahni 
在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。

Clifford A.Shaffer 
在《数据结构与算法分析》一书中的定义是:“数据结构是 ADT(抽象数据类型 Abstract Data Type 的物理实现。”

Lobert L.Kruse 
在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。

一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。

在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。

选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。

“数据结构”作为一门独立的课程在国外是从1968年才开始设立的。 1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。

计算机是一门研究用计算机进行信息表示和处理的科学。这里面涉及到两个问题:

信息的表示

信息的处理

而信息的表示和组又直接关系到处理信息的程序的效率。随着计算机的普及,信息量的增加,信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。因此,为了编写出一个“好”的程序,必须分析待处理的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。众所周知,计算机的程序是对信息进行加工处理。在大多数情况下,这些信息并不是没有组织,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。数据的结构,直接影响算法的选择和效率。

计算机解决一个具体问题时,大致需要经过下列几个步骤:首先要从具体问题中抽象出一个适当的数学模型,然后设计一个解此数学模型的算法(Algorithm),最后编出程序、进行测试、调整直至得到最终解答。寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。计算机算法与数据的结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率。运算是由计算机来完成,这就要设计相应的插入、删除和修改的算法 。也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。

数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体考虑。一个数据元素由若干个数据项组成。数据项是数据的不可分割的最小单位。有两类数据元素:一类是不可分割的原子型数据元素,如:整数"5",字符 "N" 等;另一类是由多个款项构成的数据元素,其中每个款项被称为一个数据项。例如描述一个学生的信息的数据元素可由下列6个数据项组成。其中的出身日期又可以由三个数据项:""""""组成,则称"出身日期"为组合项,而其它不可分割的数据项为原子项。

关键字指的是能识别一个或多个数据元素的数据项。若能起唯一识别作用,则称之为 "关键字,否则称之为 "关键字。

数据对象是性质相同的数据元素的集合,是数据的一个子集。数据对象可以是有限的,也可以是无限的。

数据处理是指对数据进行查找、插入、删除、合并、排序、统计以及简单计算等的操作过程。在早期,计算机主要用于科学和工程计算,进入八十年代以后,计算机主要用于数据处理。据有关统计资料表明,现在计算机用于数据处理的时间比例达到80%以上,随着时间的推移和计算机应用的进一步普及,计算机用于数据处理的时间比例必将进一步增大。

数据结构是指同一数据元素类中各数据元素之间存在的关系。数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。逻辑结构形式地定义为(KR)(或(DS)),其中,K是数据元素的有限集,RK上的关系的有限集。

数据元素相互之间的关系称为结构。有四类基本结构:集合、线性结构、树形结构、图状结构(网状结构)。树形结构和图形结构全称为非线性结构。集合结构中的数据元素除了同属于一种类型外,别无其它关系。线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。在图形结构中每个结点的前驱结点数和后续结点数可以任意多个。

数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。

数据结构中,逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。线性结构的顺序存储结构是一种随机存取的存储结构,线性表的链式存储结构是一种顺序存取的存储结构。线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。逻辑结构与数据元素本身的形式、内容、相对位置、所含结点个数都无关。

算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新的排序等。

数据结构的形式定义为:数据结构是一个二元组:

Data-Structure=(D
S)

其中:D是数据元素的有限集,SD上关系的有限集。

数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。数据类型可分为两类:原子类型、结构类型。一方面,在程序设计语言中,每一个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。可以认为,数据类型是在程序设计中已经实现了的数据结构。另一方面,在程序设计过程中,当需要引入某种新的数据结构时,总是借助编程语言所提供的数据类型来描述数据的存储结构。

计算机中表示数据的最小单位是二进制数的一位,叫做位。我们用一个由若干位组合起来形成的一个位串表示一个数据元素,通常称这个位串为元素或结点。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域。元素或结点可看成是数据元素在计算机中的映象。

一个软件系统框架应建立在数据之上,而不是建立在操作之上。一个含抽象数据类型的软件模块应包含定义、表示、实现三个部分。

对每一个数据结构而言,必定存在与它密切相关的一组操作。若操作的种类和数目不同,即使逻辑结构相同,数据结构能起的作用也不同。

不同的数据结构其操作集不同,但下列操作必不可缺:

1,
结构的生成;

2.
结构的销毁;

3,
在结构中查找满足规定条件的数据元素;

4,
在结构中插入新的数据元素;

5,
删除结构中已经存在的数据元素;

6,
遍历。

抽象数据类型:一个数学模型以及定义在该模型上的一组操作。抽象数据类型实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。抽象数据类型可用以下三元组表示:(DSP)。D是数据对象,SD上的关系集,P是对D的基本操作集。ADT的定义为:

ADT 
抽象数据类型名{

数据对象:(数据元素集合)

数据关系:(数据关系二元组结合)

基本操作:(操作函数的罗列)

} ADT 
抽象数据类型名;

抽象数据类型有两个重要特性:

数据抽象

ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。

数据封装

将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。

数据(Data)是信息的载体,它能够被计算机识别、存储和加工处理。它是计算机程序加工的原料,应用程序处理各种各样的数据。计算机科学中,所谓数据就是计算机加工处理的对象,它可以是数值数据,也可以是非数值数据。数值数据是一些整数、实数或复数,主要用于工程计算、科学计算和商务处理等;非数值数据包括字符、文字、图形、图像、语音等。数据元素(Data Element)是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等。例如,学生信息检索系统中学生信息表中的一个记录等,都被称为一个数据元素。
有时,一个数据元素可由若干个数据项(Data Item)组成,例如,学籍管理系统中学生信息表的每一个数据元素就是一个学生记录。它包括学生的学号、姓名、性别、籍贯、出生年月、成绩等数据项。这些数据项可以分为两种:一种叫做初等项,如学生的性别、籍贯等,这些数据项是在数据处理时不能再分割的最小单位;另一种叫做组合项,如学生的成绩,它可以再划分为数学、物理、化学等更小的项。通常,在解决实际应用问题时是把每个学生记录当作一个基本单位进行访问和处理的。
数据对象(Data Object)或数据元素类(Data Element Class)是具有相同性质的数据元素的集合。在某个具体问题中,数据元素都具有相同的性质(元素值不一定相等),属于同一数据对象(数据元素类),数据元素是数据元素类的一个实例。例如,在交通咨询系统的交通网中,所有的顶点是一个数据元素类,顶点A和顶点B各自代表一个城市,是该数据元素类中的两个实例,其数据元素的值分别为AB 数据结构(Data Structure)是指互相之间存在着一种或多种关系的数据元素的集合。在任何问题中,数据元素之间都不会是孤立的,在它们之间都存在着这样或那样的关系,这种数据元素之间的关系称为结构。根据数据元素间关系的不同特性,通常有下列四类基本的结构:

⑴集合结构。该结构的数据元素间的关系是“属于同一个集合”。
⑵线性结构。该结构的数据元素之间存在着一对一的关系。
⑶树型结构。该结构的数据元素之间存在着一对多的关系。
⑷图形结构。该结构的数据元素之间存在着多对多的关系,也称网状结构。 从上面所介绍的数据结构的概念中可以知道,一个数据结构有两个要素。一个是数据元素的集合,另一个是关系的集合。在形式上,数据结构通常可以采用一个二元组来表示。
数据结构的形式定义为:数据结构是一个二元组
Data_Structure 
=(DR
其中,D是数据元素的有限集,RD上关系的有限集。线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。在一个线性表中数据元素的类型是相同的,或者说线性表是由同一类型的数据元素构成的线性结构。在实际问题中线性表的例子是很多的,如学生情况信息表是一个线性表:表中数据元素的类型为学生类型一个字符串也是一个线性表:表中数据元素的类型为字符型,等等。
线性表是最简单、最基本、也是最常用的一种线性结构。 线性表是具有相同数据类型的n(n>=0)个数据元素的有限序
列,通常记为:
(a1
a2,… ai-1aiai+1,…an)
其中n为表长, n时称为空表。 它有两种存储方法:顺序存储和链式存储,它的主要基本操作是插入、删除和检索等。

 

算法是对解题方案准确而完整的描述.它是对特定问题求解步骤的一种描述,是指令的有限序列,其中每条指令表示一个或多个操作.严格说来,一个算法必须具有下列5个主要特性.
(1)
有穷性.一个算法必须在执行有穷步之后结束(对任何合法的输入值),而且每一步都必须在有穷时间内完成.
(2)
确定性.算法中每条指令必须有确切含义,且在任何条件下,算法只有惟一的一条执行路径.
(3)
可行性.算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现.
(4)
有输入.一个算法有0个或多个输入,这些输入取自于某个特定的对象集合.
(5)
有输出.一个算法有0个或多个输出,这些输出是同输入有着某些特定关系的量.
综上所述,算法是一组严谨的定义运算顺序的规则,而且每一个规则都是有效且明确的,此顺序将在有限的次数下终止.【算法的复杂度】
算法的复杂度是本章的重点也是难点.
选用算法首先要考虑正确性,还要考虑执行算法所耗费的时间和存储空间,同时,算法应易于理解,编码和调试等.算法的复杂度可分为时间复杂度和空间复杂度,是衡量算法优劣的量度.
1.
算法的时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量.一般情况下,算法中的基本操作重复执行的次数是问题规模n的某个函数f (n).算法的时间量度记作:算法的工作量= f (n),它表示随问题规模n的增大,算法执行时间的增长率和f (n)的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度.
2.
算法的空间复杂度
一个算法的空间复杂度一般是指执行这个算法所需要的内存空间,即算法程序所占用的空间,初始输入数据所占的存储空间,以及算法执行过程中所需要的额外空间.
【数据结构】
利用计算机进行数据处理是计算机应用的一个重要领域.数据结构作为计算机的一门学科,主要研究和讨论以下3个方面的问题.
(1)
数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构.
(2)
在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构.
(3)
对各种数据结构进行的运算.
简单地说,数据结构就是问题的数据模型.一般说来,用计算机解决一个具体问题时,大致需要经历下列几个步骤.
(1)
首先从具体问题中抽象出一个适当的数学模型.
(2)
然后设计一个解此数学模型的算法.
(3)
最后编写程序,进行测试,调整,直至得到最终解答.
寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述.
【数据的逻辑结构】
数据结构是指反映数据元素之间关系的数据集合的表示.更通俗地说,数据结构是指带有结构的数据元素之间的前后件关系.因此,所谓结构,实际上就是指数据元素之间的前后件关系.
数据的逻辑结构是指数据元素之间的逻辑关系,它可以用一个数据元素的集合和定义在此集合上的若干关系来表示.
数据的逻辑结构是从逻辑关系上描述数据,它与数据在计算机中的存储位置无关,是独立于计算机的.
【数据的存储结构】
数据的存储结构是本章的重要知识点.它是数据元素及其关系在计算机存储器内的表示.数据的存储结构是逻辑结构用计算机语言的实现,即建立数据的机内表示.存储结构的主要内容是指在存储空间中使用一个存储结点来存储一个数据元素;在存储空间中建立各存储结点之间的关联,以表示数据元素之间的逻辑关系.其中存储结点是指一个数据元素在存储结构中的存储.
一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,常用数据的存储结构有如下4.
(1)
顺序存储方式.每一个存储结点只含有一个数据元素.所有的存储结点相继存储在一个连续的存储区里.用存储结点之间的位置关系表示数据元素之间的逻辑关系.
(2)
链式存储方式.每一个存储结点不仅含有各数据元素,还包括指针.每一个指针指向一个与本结点有逻辑关系的结点,即用指针表示逻辑关系.
(3)
索引存储方式.每一个存储结点仅含有一个数据元素,所有的存储结点都连续存放.此外,增设一个索引表.
(4)
散列存储方式.每一个存储结点仅含有一个数据元素,数据元素按散列函数确定存储位置.
采用不同的存储结构,其数据处理的效率是不同的.因此,在进行数据处理时,选择合适的存储结构是很重要的.
【数据的运算】
数据运算是对数据施加的操作.常用的运算有如下几种.
(1)
查找运算.从结构中找出满足某种条件的结点的位置.
(2)
读取运算.读出结构中指定位置上的内容.
(3)
插入运算.在结构中的某指定位置上增加一个新的结点.
(4)
删除运算.撤销结构中指定位置上的结点.
(5)
更新运算.修改结构中某指定结点的内容.
【数据结构的图形表示】
一个数据结构除了用二元关系表示外,还可以直接用图形表示.1-1是一些常见数据结构的图形表示示例.
(a)
线性结构 (b)树形结构 (c)图状结构 (d)集合结构
1-1 常见数据结构的图形表示示例
【线性结构与非线性结构】
根据数据结构中各数据元素之间前后件关系的复杂程度,将数据结构分成两大类型:线性结构和非线性结构.
1.
线性结构
在数据元素的非空有限集中,线性结构的逻辑特征如下:
(1)
存在惟一的一个被称做"第一个"的数据元素;
(2)
存在惟一的一个被称做"最后一个"的数据元素;
(3)
除第一个之外,集合中的每个数据元素均只有一个前驱;
(4)
除最后一个之外,集合中的每个数据元素均只有一个后继.
线性表是一个线性结构.
2.
非线性结构
非线性结构的逻辑特征是:一个结点可能有多个直接前驱和直接后继.例如,树和图都是非线性结构.
线性结构与非线性结构都可以是空的数据结构.一个空的数据结构究竟属于线性结构还是非线性结构,要根据具体情况来确定.如果对该数据结构的运算是按线性结构的规则来处理的,则属于线性结构;否则属于非线性结构.
【线性表】
线性表是最简单,最常用的一种数据结构.线性表是n个数据元素的有限序列.每个数据元素的具体含义在不同情况下各不相同,它可以是一个数,或是一个符号,也可以是一页书,甚至其他更复杂的信息.在不同的情况下,它可以有不同的含义.
例如,26个英文字母的字母表(A,B,C,D,,Z)是一个线性表,表中的数据元素是单个字母.
又如,某校19982004年的计算机拥有量的变化情况,可以用线性表的形式给出:(23,35,67,156,240,287,324).表中的数据元素是整数.
【线性表的顺序存储结构】
线性表的顺序存储结构指的是用一组地址连续的存储单元依次存储线性表中的数据元素.其特点如下:
(1)
线性表中所有元素所占的存储空间是连续的;
(2)
线性表中各数据元素在存储空间中是按逻辑顺序依次存放的.
可以看出,在线性表的顺序存储结构中,其前后件两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面.
1-2说明了数据元素在计算机内的存储情况.其中a1,a2,,an表示线性表中的数据元素.
1-2 线性表的顺序存储结构示意图
在线性表的顺序存储结构中,如果线性表中各数据元素所占的存储空间(字节数)相等,则要在该线性表中查找某一个元素是很方便的.
所有数据元素的存储位置均取决于第一个数据元素的存储位置,:
LOC(ai) = LOC(a1) + (i-1) 
× C
 
基地址 一个数据元素所占的字节数
【线性表的插入运算】
插入和删除运算是线性表的基本操作.插入运算是指在结构中的某指定位置上增加一个新结点;而删除运算是指撤销结构中某结点的内容.下面依次进行详细讨论.
线性表的插入操作是指在线性表的第i-1个数据元素和第i个数据元素之间插入一个新的数据元素,就是要使长度为n的线性表
(a1,
,ai-1,ai,,an)
变成长度为n+1的线性表
(a1,
,ai-1,b,ai,,an)
数据元素ai-1ai之间的逻辑关系发生了变化.
一般情况下,要在第i(1in)个元素之前插入一个新元素,首先要从最后一个(即第n)元素开始,直到第i,元素之间共n-i+1个元素依次向后移动一个位置,移动结束后,i个位置就被空出,然后将新元素插入到第i.插入结束后,线性表的长度就增加了1.
平均情况下,要在线性表中插入一个新元素,需要移动表中一半的元素.因此,在线性表顺序存储的情况下,要插入一个新元素,其效率是很低的,特别是在线性表比较大的情况下更为突出,由于数据元素的移动而消耗较多的处理时间.
【线性表的删除运算】
和线性表的插入运算相反,线性表的删除操作是使长度为n的线性表
(a1,
,ai-1,ai,ai+1,,an)
变为长度为n-1的线性表
(a1,
,ai-1,ai+1,,an)
数据元素ai-1,aiai+1之间的逻辑关系发生了变化.
一般情况下,要删除第i(1in)个元素,要从第i+1个元素开始,直到第n个元素,之间共n-i个元素依次向前移动一个位置.删除结束后,线性表的长度就减小了1.
平均情况下,要在线性表中删除一个元素,需要移动表中一半的元素.因此,在线性表顺序存储的情况下,要删除一个元素,其效率也是很低的,特别是在线性表比较大的情况下更为突出,由于数据元素的移动而消耗较多的处理时间.
【栈】
栈是限定仅在表尾进行插入和删除操作的线性表.因此,对栈来说,表尾端有其特殊的含义,称为栈顶;相应地,表头端称为栈底.栈顶元素总是最后被插入的元素从而也是最先能被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素.栈的修改是按"后进先出""先进后出"的原则进行的.因此,栈又称为先进后出表或后进先出表.
【栈的顺序存储结构】
栈的顺序存储结构利用一组地址连续的存储单元,依次存放自栈底到栈顶的数据元素,同时附设指针指示栈顶元素在顺序栈中的位置,如图1-3所示.
1-3 栈的顺序存储结构示意图
在图1-3,a1为栈底元素,an为栈顶元素.栈中的元素按照a1, a2, , an的次序进栈,退栈的第一个元素为栈顶元素an.
【栈的基本运算】
栈的基本运算有3:入栈,出栈与读栈顶元素.
1.
入栈运算
入栈运算是指在栈顶插入一个新元素.可分为两个基本操作:首先将栈顶指针进一,然后将新元素插入到栈顶指针指向的位置.
当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,不能再进行入栈操作.
2.
退栈运算
退栈运算是指取出栈顶元素并赋给一个指定的变量.可分为两个基本操作:首先将栈顶元素(栈顶指针指向的元素)赋给一个指定的变量,然后将栈顶指针退一.
当栈顶指针为0,说明栈空,不能进行退栈操作.
3.
读栈顶元素
读栈顶元素是指将栈顶元素赋给一个指定的变量.必须注意,这个运算不删除栈顶元素,只是将它的值赋给一个变量,因此,在这个运算中,栈顶指针不会改变.
【队列】
队列是限定仅在表的一端进行插入,而在表的另一端删除数据元素的线性表.在队列中,允许插入的一端叫做队尾,允许删除的一端叫做队头.
【队列的顺序存储结构】
与栈的存储结构相似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队头到队尾的元素之外,还需要附设两个指针,分别指示队头元素和队尾元素的位置.
与栈相反,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端删除元素.这与日常生活中的排队是一样的,早进入队列的早离开.
【队列的基本运算】
队列的基本运算有入队和退队两种.
1.
入队运算
入队运算是指在队尾加入一个新元素.这个运算有两个基本操作:首先将队尾指针进一,然后将新元素插入到队尾指针指向的位置.
2.
退队运算
退队运算是指在队头位置退出一个元素并赋值给指定的变量.这个运算有两个基本操作:首先将队头指针进一,然后将队头指针指向的元素赋给指定的变量.
【线性单链表】
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).因此,为了表示每个数据元素ai 与其直接后继元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需要存储一个指示其直接后继的信息(即直接后继的存储信息).这两部分信息组成数据元素ai的存储映像,称为结点.它包括两个域:
(1)
存储数据元素信息的域称为数据域;
(2)
存储直接后继存储位置的域称为指针域.
指针域中存储的信息称为指针或链.N个结点链接成一个链表,即为线性表的链式存储结构,又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表.
通常以线性表中第一个数据元素的存储地址作为线性表的地址,称做线性表的头指针.有时,为了操作方便,在第一个结点之前虚加一个"头结点",以指向头结点的指针为链表的头指针.整个链表存取必须从头指针开始进行,头指针指示链表中第一个结点的存储位置.同时,由于最后一个数据元素没有直接后继,则线性链表中最后一个结点的指针为"".
【循环链表】
循环链表是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环.由此,从表中任一结点出发均可找到表中的其他结点.
循环链表和单链表的差别仅在于判断链表中最后一个结点的条件不再是"后继是否为空",而是"后继是否为头结点".
【双向链表】
以上讨论的链式存储结构的结点中,只有一个指示直接后继的指针域,由此从某个点出发,只能顺指针往后寻查其他结点.若要寻查结点的直接前驱,则需要从表头指针出发,这样影响查找效率.为了克服单链表这种单向性的缺点,可利用双向链表.在双向链表的结点中,有两个指针域,其一指向直接后继,另一个指向直接前驱.
【链表的基本操作】
链表的基本操作可以分为"插入""删除"两种.
1.
插入操作
假设要在线性表的两个数据元素ab之间插入一个数据元素x,已知p为其链表存储结构中指向结点a的指针.如图1-4(a)所示.
为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在链表中.根据插入操作的逻辑定义,还需要修改结点a中的指针域,令其指向结点x,而结点x中的指针域应指向结点b,从而实现3个元素a,bx之间逻辑关系的变化.插入后的链表如图1-4(b)所示.
(a)
插入前 (b)插入后
1-4 链表的插入操作
2.
删除操作
反之,如图1-5所示,在线性表中删除元素b,为在链表中实现元素a,bc之间
逻辑关系的变化,仅须修改结点a中的指针域即可.
1-5 链表的删除操作
【树及其基本概念】
树是一种简单的非线性结构.在树这种数据结构中,所有数据元素之间的关系具有明显的层次性.1-6表示了一棵一般的树.由此图可以看出,在用图形表示树这种数据结构时,很像自然界中的树.
树是n(n0)个结点的有限集.在任意一棵非空树中:
(1)
有且仅有一个特定的称为根的结点;
(2)
n>1,其余结点可分为m(m>0)个互不相交的有限集T1, T2, , Tm.其中,每个有限集本身又是一棵树,并且称为根的子树.
在图1-6中可以看到树的根结点A及子树(a).
有关树的基本术语有很多,其中常用的有以下几种.
(1)
结点.包含一个数据元素及若干指向其子树的分支.
(2)
结点的度.结点拥有的子树数.如在图1-6,结点A的度为3,C的度为1.
(3)
叶子.度为0的结点称为叶子.如在图1-6,E,I,J,G,H都是叶子结点.
1-6 树的结构示例
(4)
孩子和双亲.结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲.同一个双亲的孩子之间互称为兄弟.例如,在图1-6,F为子树(a)的根,同时F又是B的孩子,AB,C,D的双亲,B,C,D互为兄弟.
(5)
层次.结点的层次从根开始定义,根为第一层,根的孩子为第二层.若某结点在第i,则其子树的根就在第i+1.
(6)
深度.树中结点的最大层次称为树的深度或高度.如图1-6中的树深度为4.
【二叉树】
二叉树及其相关的概念和操作是本章中非常重要的知识点.二叉树是另一种树形结构,它的特点是每个结点至多只有两棵子树,并且二叉树的子树有左右之分,其次序不能任意颠倒.1-7是一棵二叉树的示例.
1-7 二叉树示例
【二叉树的存储结构】
1.
二叉树的顺序存储结构
在二叉树的第零层有20=1个结点即根结点.第一层根据根结点的子结点的个数不同有12个结点.第二层的结点总数为1~4不等,最大值4只有当根结点及其两个子结点都拥有最多的子结点数目(即两个子结点)时才能达到.一般情况下,二叉树的第n层的结点数可以在1~2n之间变化.每层平均的结点数定义为树的密度.树的密度也可看作是对树的规模(结点数目)相对于树的深度的衡量.
在图1-8,A9个结点,深度为3;而树B5个结点,深度为4.后者是一种特殊的情况,称为退化树,因为只有一个叶结点,且每一个非叶结点只有一个子结点.n结点退化树的深度为n-1.可以看出,退化的树和链表是等价的.
1-8 二叉树和退化树
作为一种数据结构,高密度的树更加重要,因为它能够更紧密地将结点聚集在根结点的周围.这样访问数据的路径就可以尽可能地短.更精确地说,退化树的密度是一种极端情况.另一个极端,深度为n的完全的二叉树的第0层到第n(1层的结点是满的,而在第n,叶子结点则占据了最左边的位置.最大的深度为n的完全二叉树在第n层有2n个结点.在这样的二叉树中,每个内部结点有两个子结点.1-9区分了完全和非完全二叉树.
1-9 完全二叉树和非完全二叉树
2.
二叉树的链式存储结构
在二叉树的二叉链表存储中,通常采用的方法是:每个结点中设置3个域,即值域,

posted on 2009-07-22 00:10 XBOX 阅读(142) 评论(0)  编辑 收藏 引用 网摘 所属分类: 数据结构与算法

只有注册用户登录后才能发表评论。
网站导航: