数据结构初探(一)栈与栈的应用
(一)在描述栈(stack)之前,我们先了解一下数据结构基础概念:
1、数据(data)是对客观事物的符号表示,数据元素(data element)是数据的基本单位,一个数据元素可由若干个数据项(data item)组成,数据项为数据的不可分割的最小单位,数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。数据元素相互之间的关系称为结构(structure)。
2、根据数据元素之间关系不同特性,通常有下列四类基本结构:
(1.)集合 机构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系;
(2.)线性结构 结构中的数据元素之间存在一个对一个的关系;
(3.)树形结构 结构中的数据元素之间存在一个对多个的关系;
(4.)网状结构或图状结构 机构中的数据元素之间存在多个对多个的关系。
3、描述数据元素之间的逻辑关系的结构称为逻辑结构。数据机构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。
在计算机中,我们用一个由若干位最合起来形成的一个位串表示一个数据元素,通常称这个位串位元素或结点(node)。
4、数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储机构:顺序存储机构和链式存储结构。数据类型(data type)是和数据结构密切相关的一个概念,是一个值得集合和定义在这个集合上的一组操作的总称。分为原子类型和结构类型。
5、抽象数据类型(abstract data type,简称adt)是指一个数学模型以及定已在该模型上的一组操作:
(1.)原子类型(atomic data type)属原子类型的变量的值是不可分解的;
(2.)固定聚合类型(fixed-aggregate data type)属该类型的变量,其值由确定成分按某种结构组成;
(3.)可变聚合类型(variable-aggregate data type)构成该类型的变量其“值”的数目不确定。
6、多形数据类型(polymorphic data type)是指其值的成分不确定的数据类型。
算法(algorithm)是对特淡定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
(二)栈(stack)是一种重要的数据结构。从数据结构角度来看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集。所以还需要了解一些关于线性表的知识:
1、线形表是一种线性结构,线性结构的特点是:
(1.)存在唯一的一个被称作“第一个”的数据元素;
(2.)存在唯一的一个被称作“最后一个”的数据元素;
(3.)除第一个之外,集合的每个数据元素均只有一个前驱;
(4.)除最后一个之外,集合的每个元素均只有一个后继。
2、线性表(linear_list)是最常用且最简单的一种数据结构。简言之,一个线性表是n个数据元素的有限序列。在稍复杂的线性表中,一个数据元素可以有若干个数据项(item)组成。在这种情况下,常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)。
3、线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示没个数据元素与其后继元素之间的逻辑关系,除了存储其本身的信息外,还需存储一个指示其直接后继的信息。这两部分信息组成数据元素的存储映像,称为结点(node)。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称作指针或链。
4、n个结点链结成一个链表,即为线性表的链式存储结构。又由于此链表的每个结点中只包含一个指针域,故称做线性链表或单链表。循环链表(circular linked list)是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域只想头结点,整个链表形成一个环。双向链表,可以双向读取数据元素的循环链表。
(三)栈和栈的应用:
1、栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。不含元素的空表称为空栈。它按照先进后出(last in first out)的原则进行,是一种lifo结构的线性表。
2、栈的存储表示方法:
(1.)顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时附设指针top只是栈顶元素在顺序栈中的位置。习惯上用top=0表示空栈,由于栈在使用过程中所需最大空间的大小很难估计,因此,一般来说,在初始化设空栈时不应限定栈的最大容量。所以可以先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够用时再逐段扩大。为此,设定两个常量:stack_init_size(存储空间初始分配量)和stackinchrement(存储空间分配增量)。
(2.)栈的链式表示,与单链表和双向链表十分相似,不在详细描述。
3、栈的应用举例:
(1.)数值转换
将十进制数1348转换为八进制数,采用了eclipse编辑器和stack模板:
结果为:
(2.)括号匹配的检验
输入一个中括号和小括号组成的char数组,然后进行括号匹配检验:
结果为:
(3.)行编辑程序
输入一个字符串,遇到字符‘#’时删除前面的字符,遇到字符‘@’时删除前面的字符:
结果为:
(4.)迷宫求解
分别用两个stack记录x,y坐标,即可。
(5.)运算符优先级
与(3.)非常相似,后面有时间再补充。
(6.)递归
主要有八皇后问题,hanoi问题等。