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

本文详细介绍了栈这种数据结构,包括栈的基本概念、栈的操作(如插入、删除、获取栈顶元素等)、栈的顺序存储结构及其相关实现。此外还提到了栈的链式存储结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈是只能在表尾进行插入和删除的一种简单一点的线性表。表尾端是栈顶(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())等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值