一、栈(stack)
1、基本概念
- 栈是一种特殊的线性表,又称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out)线性表
- 插入删除运算仅限定在线性表的某一端进行,不能再表中间和另一端进行
- 栈的插入操作称为进栈(入栈、Push),删除操作称为出栈(退栈、Pop)
- 栈顶:允许进行插入和删除的一端称为栈顶 栈底:另一端,固定不变
- 栈顶元素:处于栈顶位置的数据元素
- 空栈:不含任何数据元素的栈
2、基本运算
初始化栈 :
InitStack(S)
。
建立一个空栈S。
销毁栈 :
DestroyStack(S)
。
释放栈S占用的内存空间。进栈Push(S, x)。将元素x插入栈S中,使x成为栈S的栈顶元素。
出栈:
Pop(S,
x
)
。
当栈S不空时,将栈顶元素赋给x,并从栈中删除当前栈顶。
取栈顶元素 :
GetTop(S)
。
若栈S不空,取栈顶元素x并返回1;否则返回0。
判断栈空 :
StackEmpty(S)
。判断栈S是否为空栈。
示例
3、栈的顺序存储结构(顺序栈)
顺序栈类型声明:
静态分配:
- 顺序栈通常由一个一维数组data和一个记录栈顶元素位置的变量top组成
- 习惯上将栈底放在数组下标小的那端,栈顶元素由栈顶指针top所指向
动态分配:
- 用base表示栈底指针,栈底固定不变
- 用top指示当前栈顶位置,栈顶随着进栈和退栈操作而变化
- 用top==base作为栈空的标记
- 每次top指向栈顶数组中的下一个存储位置
#define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACK_INCREAMENT 10 //存储空间分配增量 typedef char ElemType; //静态分配 typedef struct{ ElemtType elem[STACK_INIT_SIZE]; //一维数组 int top; //记录栈顶元素位置的变量 }SqStack; //动态分配 typedef struct { ElemType *base; //栈底指针 Elemtype *top; //栈顶指针 int stacksize; //栈空间大小 } SqStack; //顺序栈
插入删除过程中只有top指针变化
对于顺序栈S,可通过动态申请得到其存储空间,它有4个要素:
栈空条件:S.top==S.base
栈满条件:S.top-S.base>=S.stacksize
元素e进栈操作:*(S.top)++=e //先进行*(S.top)运算再进行++运算
元素e出栈操作:e=*- - S.top //先进行- -操作再把- -s.top的值赋给e
基本算法设计
1、初始化栈
主要操作:通过动态申请所需的存储空间,并且 初始化相关的参数(top,base,stacksize)。
void InitStack(SqStack &S)
{
if(!(S.base=(Elemtype*)malloc(STACK_INIT_SIZE *sizeof(ElemtType))))
exit(OVERFLOW);//存储分配失败
S.tpo=S.base;//空栈
S.stacksize=STACK_INIT_SIZE; //栈空间大小
}
2、销毁栈
主动释放空间, 栈顶、栈底 两个指针置空, 栈空间 大小置零
void DestroyStack(SqStack &S)
{
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
}
3、进栈
主要操作:判断是否存在“溢出”
void Push(Sqstack &S,Elemtype e)
{
if(S.top-S.base>=S.stack)
{ //栈满,追加存储空间
S.base=(ElemType*)realloc(S.base,(S.stacksize+STACK+INCREMENT)*sizeof(ElemType));
if(S.base)
exit(OVERFLOW); //存储分配失败
S.top=S.base+