- 1
- 0
- 约1.92万字
- 约 51页
- 2021-07-28 发布于北京
- 举报
e 进栈e出栈栈顶top栈底bottom ean-1 … a1 图3.1a0 第三章 栈和队列 栈和队列逻辑上也是线性表。但操作只是作用在表的某些元素上,属于操作受限制的线性表。栈和队列技术虽然简单,但在软件实现中有广泛的应用。本章讨论栈和队列的逻辑和存储表示、运算及相关算法的实现等问题,并例举了一些栈和队列的典型应用。3.1栈的定义及操作1.定义:栈(stack)逻辑上是一种线性表,记为栈S=(a0,a1,…,an-1 )。 对栈S的运算(插入、删除等)限定在表的一端进行,如图3.1所示。 栈的定义及操作 若元素进栈顺序为a0,a1,…,an-1,则出栈顺序是an-1,an-2,…,a0,即后进栈的元素先出栈,故栈可称作“后进先出”(Last In First Out,LIFO---特征)的线性表。当表中元素为空时,称“栈空”。若栈的存储空间已满,再作进栈运算时称“栈满溢出”。2.栈的抽象数据类型ADT Stack{ 数据元素集:D={ai | ai∈datatype, i=0,1,2, ?????????n-1 ,n≥0} 数据关系集:R={ ai , ai+1| ai, ai+1∈D, 0≤i≤n-2} 基本操作集:PStackInit(S)操作结果:创建一个空栈S。StackDestory(S) 初始条件:栈S存在。操作结果:撤销栈S。ClearStack(S)初始条件:栈S存在。操作结果:将S清为空栈。StackLength(S)初始条件:栈S存在。操作结果:求栈S的元素个数。EmptyStack(S)初始条件:栈S存在。操作结果:若S为空栈,则返回TRUE(或返回1),否则返回FLASE(或返回0)。FullStack(S)初始条件:栈S存在。操作结果:若S为已满,则返回TRUE,否则返回FLASE。tope an-1 … … a1 a0 栈的定义及操作Push(S,e) 初始条件:栈S存在且未满。 操作结果:插入数据元素e,使之成为新栈顶元素。Pop(S)初始条件:栈S存在且非空。 操作结果:删除S的栈顶元素并返回其值。GetTop(S) 初始条件:栈S存在且非空。 操作结果:返回栈顶元素的值。StackTraverse(S)初始条件:栈S存在且非空。 操作结果:从栈顶到栈底依次调用 visit()函数访问S中的每一个元素。}ADT Stack; 例3-1 设元素为1,2,3,4,进栈顺序约定:值小的元素先进栈,但在两次进栈之间,可作出栈运算。问对于进栈序列(1,2,3,4),可得到多少种出栈序列? 显然(1,2,3,4)可为一个出栈序列:1进、1出;2进、2出;3进、3出;4进、4出。但序列(4,2,3,1)是不能得到(为什么?)。栈顶top 图3.2… 4 3 2 1 栈的定义及操作 根据约定条件,诸如(4,2,3,1)这样的出栈序列是不能得到的。因为要使出栈序列之首为“4”,栈的状态如图3.2所示。 将“4”弹出后,根据LIFO规则,下一个出栈的应为“3”,而不是“2”。 各出栈序列如下: (1,2,3,4), (1,2,4,3), (1,3,2,4), (1,3,4,2), (1,4,3,2); (2,1,3,4), (2,1,4,3), (2,3,1,4), (2,3,4,1), (2,4,3,1); (3,2,1,4), (3,2,4,1), (3,4,2,1);(4,3,2,1)。 maxsize-1 s-top 1 0 an-1 … a1 a0 3.1.2栈的顺序存储结构1.顺序栈的描述顺序栈,即栈的顺序存储结构,类似线性表的顺序存储C语言描述如下: #define maxsize 64 //栈最大容量 typedef struct { datatype data[maxsize]; //栈的存储空间 int top; //栈顶指针(或游标) }sqstack,*sqslink; //顺序栈说明符若说明sqslink s; s=(sqlink)malloc(sizeof(sqstack));则S指向一个顺序栈,如图3.3所示。 栈顶元素an-1写作:s-data[s-top]。 栈空时s-top=-1; 栈满时s-top=maxsize-1。图3.3顺序栈运算2.顺序栈操作的算法实现 (1)void Clearstack(sqslink s) //置栈空 {s-top=-1;} (2)int Emptystack(sqslink s) //判栈空 {if(s-top0) return(1); //栈空返回1 else return(0) ;} //栈非空返回0 (3)int Pu
原创力文档

文档评论(0)