数据结构教程3栈和队列讲解.ppt
文本预览下载声明
第3章 栈和队列;1 栈的概念
栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out)线性表。
栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。
栈底(Bottom):是固定端,又称为表头。
空栈:当表中没有元素时称为空栈。; 设栈S=(a1,a2,…an),则a1称为栈底元素,an为栈顶元素,如图3-1所示。
栈中元素按a1,a2,…an的次序进栈,退栈的第一个元素应为栈顶元素。即栈的修改是按后进先出的原则进行的。; 栈的顺序存储结构简称为顺序栈,和线性表相类似,用一维数组来存储栈。根据数组是否可以根据需要增大,又可分为静态顺序栈和动态顺序栈。
◆ 静态顺序栈实现简单,但不能根据需要增大栈的存储空间;
◆ 动态顺序栈可以根据需要增大栈的存储空间,但实现稍为复杂。; 采用动态一维数组来存储栈。所谓动态,指的是栈的大小可以根据需要增加。
◆ 用bottom表示栈底指针,栈底固定不变的;栈顶则随着进栈和退栈操作而变化。用top(称为栈顶指针)指示当前栈顶位置。
◆ 用top=bottom作为栈空的标记,每次top指向栈顶数组中的下一个存储位置。
◆ 结点进栈:首先将数据元素保存到栈顶(top所指的当前位置),然后执行top加1,使top指向栈顶的下一个存储位置;;◆ 结点出栈:首先执行top减1,使top指向栈顶元素的存储位置,然后将栈顶元素取出。
图3-2是一个动态栈的变化示意图。;基本操作的实现
1 栈的类型定义
#define STACK_SIZE 100 /* 栈初始向量大小 */
#define STACKINCREMENT 10 /* 存储空间分配增量 */
#typedef int ElemType ;
typedef struct sqstack
{ ElemType *bottom; /* 栈不存在时值为NULL */
ElemType *top; /* 栈顶指针 */
int stacksize ; /* 当前已分配空间,以元素为单位 */
}SqStack ;;2 栈的初始化
Status Init_Stack(void)
{ SqStack S ;
S.bottom=(ElemType *)malloc(STACK_SIZE *sizeof(ElemType));
if (! S.bottom) return ERROR;
S.top=S.bottom ; /* 栈空时栈顶和栈底指针相同 */
S. stacksize=STACK_SIZE;
return OK ;
};3 压栈(元素进栈)
Status push(SqStack S , ElemType e)
{ if (S.top-S.bottom=S. stacksize-1)
{ S.bottom=(ElemType *)realloc((S. STACKINCREMENT+STACK_SIZE) *sizeof(ElemType)); /* 栈满,追加存储空间 */
if (! S.bottom) return ERROR;
S.top=S.bottom+S. stacksize ;
S. stacksize+=STACKINCREMENT ;
}
*S.top=e; S.top++ ; /* 栈顶指针加1,e成为新的栈顶 */
return OK;
};4 弹栈(元素出栈)
Status pop( SqStack S, ElemType *e )
/*弹出栈顶元素*/
{ if ( S.top== S.bottom )
return ERROR ; /* 栈空,返回失败标志 */
S.top-- ; e=*S. top ;
return OK ;
} ; 采用静态一维数组来存储栈。
栈底固定不变的,而栈顶则随着进栈和退栈操作变化的,
◆ 栈底固定不变的;栈顶则随着进栈和退栈操作而变化,用一个整型变量top(称为栈顶指针)来指示当前栈顶位置。
◆ 用top=0表示栈空的初始状态,每次top指向栈顶在数组中的存储位置。
◆ 结点进栈:首先执行top加1,使top指向新的栈顶位置,然后将数据元素保存到栈顶(top所指的当前位置)。;◆ 结点出栈:首先把top指向的栈顶元素取出,然后执行top减1,使top指向新的栈顶
显示全部