持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天
栈
定义和特点
定义
受约束的线性表,只允许栈顶元素入栈和出栈
特点
栈又称为后进先出的线性表,简称LIFO结构。
对栈来说,表尾端称为栈顶,表头端称为栈底,不含元素的空表称为空栈
先进后出,后进先出
表示
类型定义
栈也有两种存储表示方法,分别称为顺序栈和链栈。
抽象数据类型定义
ADT 栈(stack) Data 同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。 Operation{ InitStack(&S): 初始化操作,建立一个空栈s。 DestroyStack(&S): 若栈存在,则销毁它。 ClearStack(&S): 将栈清空。 StatckEmpty(S): 若栈存在且非空,返回true,否则返回false。 GetTop(S,&e): 若栈存在且非空,用e返回S的栈顶元素。 Push(&S,e): 若栈S存在,插入新元素e到栈S中并成为其栈顶对象。 Pop(&S,&e): 删除栈S中的栈顶元素,并用e返回其值。 StackLength(S): 返回栈S的元素个数。 StackTraverse(S,visit()): 栈S已存在且非空。从栈底到栈顶依次对S的每个数据元素调用visit()。
}endADT
顺序栈
存储结构
#define MAXSIZE 100 //顺序栈存储空间的初始分配址
typedef struct{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容扯
}SqStack;
//top 指栈顶元素后一位置
//S.top == 0时,栈空
//S.top == stacksize 时,栈满
基本操作
//栈的初始化:
Status InitStack(SqStack &S){
S.base=(SElemtype *)malloc(STACK_INIT_SIZE*sizeof(SElemtype));
if(!S.base) //如果base的值为空,则表明结构体不存在
return(OVERFLOW);
S.top=S.base; //(top=base 可作为栈为空的标记)
S.stacksize=STACK_INIT_SIZE; //按照初始分配量进行第一次存储分配
return OK;
}
//栈的销毁:
Status DestoryStack(SqStack &S)
{
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
return OK;
}
//栈的清空:
Status ClearStack(SqStack &S)
{
S.top = S.base;
return OK;
}
// 判断栈是否为空:
Status StackEmpty(SqStack S)
{
if(S.top == S.base)
return TRUE;
else
return FALSE;
}
// 返回栈顶元素:
Status GetTop(SqStack S,SElemType &e)
{
if(S.top == S.base)
return ERROR;
e = *(S.top -1);
return OK;
}
//压栈:
Status Push(SqStack &S, SElemType e)
{
if(S.top - S.base >= S.stacksize) //栈满,追加存储空间
{
S.base = (SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
//出栈:
Status Pop(SqStack &S, SElemType &e)
{
if(S.top == S.base) return ERROR;
e = * --S.top;
return OK;
}
//栈的元素个数:
int StackLength(SqStack S)
{
return S.top - S.base;
//栈元素从栈底依次输出:
Status StackTraverse(SqStack S, Status(* visit)(SElemType))
{
while(S.top > S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType e)
{
printf("%d ", e);
return OK;
}
链栈
存储结构
typedef struct {
SElemType data[MAXSIZE];
int top; *// 用于栈顶指针*
}SqStack;
基本操作
//栈的初始化:
Status InitStack(SqStack &S)
{
/* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
S.top=-1;
return OK;
//栈的清空:
Status ClearStack(SqStack &S)
{
S.top=-1;
return OK;
}
//判断栈是否为空:
Status StackEmpty(SqStack S)
{
if (S.top==-1)
return TRUE;
else
return FALSE;
}
//返回栈顶元素:
Status GetTop(SqStack S,SElemType &e)
{
if (S.top==-1)
return ERROR;
else
e=S.data[S.top];
return OK;
}
//压栈:
Status Push(SqStack &S,SElemType e)
{
if(S.top == MAXSIZE -1)
{
return ERROR;
}
S.top++; //栈顶指针增加一
S.data[S.top]=e; //将新插入元素赋值给栈顶空间
return OK;
}
//出栈:
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==-1)
return ERROR;
e=S.data[S.top];
S.top--;
return OK;
}
//栈的元素个数:
int StackLength(SqStack S)
{
return S.top+1;
}
//栈元素从栈底依次输出:
Status visit(SElemType c)
{
printf("%d ",c);
return OK;
}
Status StackTraverse(SqStack S)
{
int i;
i=0;
while(i<=S.top)
{
visit(S.data[i++]);
}
printf("\n");
return OK;
}
\