栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。由于它们广泛应用在各种软件系统中,因此在面向对象的程序设计中,它们是多型数据类型。
抽象数据类型栈的定义
栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶( top) ,相应地,表头端称为栈底(bottom)。不含元素的空表称·为空栈。
假设栈s=(,,...,),则称为栈底元素,为栈顶元素。栈中元素按,,...,的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的(如图1(a)所示)。因此,栈又称为后进先出(last in first out)的线性表(简称LIFO结构),它的这个特点可用图1(b)所示的铁路调度站形象地表示。
图1 栈(a)栈的示意图 (b)用铁路调度站表示栈
栈的基本操作除了在栈顶进行插入或删除外,还有栈的初始化、判空及去栈顶元素等。下面给出栈的抽象数据类型的定义:
栈的抽象数据类型的定义
栈的表示和实现
如果你想学编程,可以来小编的C/C++编程秃头俱乐部!
和线性表类似,栈也有两种存储表示方法。
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从О开始,则当以C作描述语言时,如此设定会带来很大不便;另一方面,由于栈在使用过程中所需最大空间的大小很难估计,因此,一般来说,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法是:先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够使用时再逐段扩大。为此,可设定两个常量:STACK- INIT_ SIZE(存储空间初始分配量)和STACKINCREMENT(存储空间分配增量),并以下述类型说明作为顺序栈的定义。
其中, stacksize指示栈的当前可使用的最大容量。栈的初始化操作为:按设定的初始分配量进行第一次存储分配, base可称为栈底指针,在顺序栈中,它始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。称top为栈顶指针,其初值指向栈底,即 top-base可作为栈空的标记,每当插人新的栈顶元素时,指针 top增1;删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一-个位置上。图2展示了顺序栈中数据元素和栈顶指针之间的对应关系。
图2 栈顶指针和栈中元素之间的关系
小编这里还有许多游戏教程可供大家学习参考,如果感兴趣的话可以点下方链接观看学习。