数据结构第3章 栈和队列(6学时).ppt

教学内容:栈和队列的结构特性;两种存储结构上实现栈和队列的基本操作以及栈和队列在程序设计中的应用。 教学要求:掌握栈和队列的特点,掌握栈类型的两种实现方法,特别应注意栈满和栈空的条件以及它们的描述方法。 熟练掌握循环队列和链队列的基本操作实现算法,特别注意队满和队空的描述方法。 重点: 栈和队列的表示和实现算法。 难点: 栈满和栈空的条件以及它们的描述方法;循环队列的队满和队空的描述方法。 3.1 栈(Stack) 3.1.1 栈(stack)的定义 1、 栈的定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈 2、栈的特点:根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。 例2:一个栈的输入序列是12345,若在入栈的过程中允许出栈,则栈的输出序列43512可能实现吗?12345的输出呢? 43512不可能实现,主要是其中的12顺序不能实现;12345的输出可以实现,只需压入一个立即弹出一个即可。 一、栈的顺序存储 栈是运算受限的线性表,线性表的存储结构对栈也适用。 1、顺序栈 栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。因此,可用一组连续的存储单元(数组)依次存放栈中的每个数据元素来实现顺序栈。因为栈底位置是固定不变的,所以可以将栈底位置设置在数组的两端的任何一个端点。 约定:用下标变量记录栈顶的位置,栈顶指针始终指向栈顶元素的上一个单元,用top(栈顶指针)表示。用base(栈底指针)记录栈底位置,为栈空间的起始位置。 栈的顺序存储表示: #define INITSIZE 100 //栈的存储空间初始分配量 typedef int ElemType; typedef struct { int top; //栈顶指针 ElemType *base; //栈底指针,存放空间起始地址 int stacksize; //当前栈空间的长度 }sqstack; 在顺序栈中有“上溢”和“下溢”的概念。 设S是sqstack类型的指针变量。若栈底位置在向量的低端,即S.base[0]是栈底元素,那么栈顶指针S.top是正向增加的,即进栈时需将S.top加1,退栈时需将S.top 减1。因此,S.top == 0时表示空栈, S.top == stacksize表示栈满。 当栈满时再做进栈运算必定产生空间溢出,简称“上溢”;当栈空时再做退栈运算也将产生溢出,简称“下溢”。 上溢是一种出错状态,应该设法避免之;下溢则可能是正常现象,因为栈在程序中使用时,其初态或终态都是空栈,所以下溢常常用来作为程序控制转移的条件。 2、顺序栈上的基本操作实现 (1) 初始化栈S (创建一个空栈S) void initstack(sqstack *S) { S-base=(ElemType *) malloc(INITSIZE*sizeof(ElemType)); if(!S-base) exit (-1); S-top=0; /*空栈标志*/ S-stacksize = INITSIZE; } (2) 获取栈顶元素 int gettop(sqstack S,ElemType *e) { if ( S.top==0 ) /* 栈空 */ { printf(“Stack is empty!\n”); return 0; } *e= S.base[top-1]; return 1; } (3) 进栈 (在栈顶插入新的元素x) int push ( sqstack *S , ElemType x ) { if (S-top == S-stacksize) { S-base= (ElemType *)realloc(S-base, (S-stacksize+1)*sizeof(ElemType)); if(!S-base) exit(-1); S-stacksize

文档评论(0)

1亿VIP精品文档

相关文档