严蔚敏版数据结构学习笔记(3):栈

来源:互联网 发布:js节点操作 编辑:程序博客网 时间:2024/06/06 06:44

栈是只能在表尾进行插入和删除的一种简单一点的线性表。表尾端是栈顶(top),表头端是栈底(bottom),不含元素的称为空栈。因为我们只能对栈顶的元素进行插入和删除操作,所以栈这个数据结构就是一个很有”原则”的结构,栈的修改是按照后进先出的原则进行的,也就是LIFO(last in first on)。
可知栈也是可以有插入删除,当然也有栈的初始化,判空以及取栈顶的操作,下面来罗列一下
ADT Stack{
InitStack(&S)//构造一个空表
DestroyStack(&S)//销毁栈S
ClearStack(&S)//清除一个表S,清我一个空栈
StackEmpty(S)//若S为空栈,则返回TRUE,否则返回FALSE
StackLength(S)//返回栈中元素的个数,也就是栈的长度
GetTop(S,&e)//用e返回栈的栈顶元素
Push(&S,e)//插入元素e为新的栈顶元素
Pop(&S,&e)//删除S的栈顶元素,并用e返回其值
StackTraverse(S,visit)//从栈底到栈顶依次对S的每个数据元素调用visit();一旦visit()失败,则操作失效
}
相同的,栈也是分为顺序栈和链栈。
我们先来定义一个顺序栈:

typedef struct {    SElemType *base;    SElemType *top;    int stacksize;}SqStack;

现在我们来试着实现构造一个空栈的操作:

Status InitStack(SqStack &s){    S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));    if(!S.base) exit(OVERFLOW);    S.top = S.base;    S.stacksize = STACK_INIT_SIZE;    return OK; }

接下来我们就要来试试数据结构中最常见的一个方法了,插入操作。

Status Push(SqStack &S,SElemType e){    //插入元素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 + STACKINCREMENT;     }         *S.top++ = e;    return OK; }

下面我们来看一下删除栈顶元素的操作:

Status Pop(SqStack &S,SElemType &e){//若栈不为空,那么删除S的栈顶元素,用e返回其值,并返回OK;否则就返回ERROR    if(S.top == S.base) return ERROR;    e = *--S.top;    return OK;}

栈顶的删除是不是要简单的多呢,没错,相比线性表和链表,栈顶的删除只需要一个步骤,那就是把使栈顶减一即可;
栈还有一个操作就是返回栈顶元素的操作:

Status GetTop(SqStack &S,SElemType &e){//若S存在,用e来返回S的栈顶元素,并返回OK,否则就返回ERROR;    if(S.top == S.base) return ERROR;//栈的判空操作是栈顶等于栈底也就是S.top == S.base    e = *(S.top-1);    return OK;}

既然线性表有他的顺序结构和链式结构,那么同样的我们的栈也有类似的链式结构:
这里写图片描述
那么他的操作门和顺序结构的有何不同呢.我会在接下来慢慢的实现链式栈的功能,并上载;
包括定义一个链式栈的结构体,初始化一个链式栈(InitStack()),返回栈顶元素(GetTop()),删除栈顶元素(Pop()),添加栈顶元素(Push())等

原创粉丝点击