详解数据结构中栈的定义和操作

2025-12-13 0 695

本文分享自华为云社区《数据结构:详细讲解栈的定义、栈的操作》,作者: 高彬滔 。

1. 栈的定义

栈(stack):是只允许在一端进行插入或者删除操作的线性表(即后进先出,大概可以理解为吃饱了吐出来)

  • 空栈:不含元素的空标配
  • 栈顶:表尾端
  • 栈底:表头端

详解数据结构中栈的定义和操作

  • 进栈顺序:a1->a2->a3->a4->a5
  • 出栈顺序:a5->a4-a3->a2->a1

2. 对比线性表和栈基本操作

2.1 线性表的基本操作

  • InitList (&L): 初始化表。构造一个空的线性表 L,分配内存空间
  • DestoryList (&L): 销毁操作。销毁线性表,并且释放线性表 L 所占用的空间
  • ListInsert (&L,i,e): 插入操作,在表 L 中的第 i 个位置上插入指定元素 e
  • ListDelete (&L,i,e): 删除操作,删除表 L 中的第 i 个位置的元素,并且用 e 返回删除元素的值
  • LocateElem (L,e): 按值查找操作,在表 L 中查找具有给定关键字值的元素
  • GetElem (L,i): 按位查找操作,获取表 L 中第 i 个位置的元素的值

2.2 栈的基本操作

  • InitStack (&S): 初始化栈,构造一个空栈 S,分配内存空间
  • DestoryStack (&S): 销毁栈,销毁并释放栈 S 所占用的内存空间
  • Push (&S,x): 进栈,若栈 S 未满,则将 x 加入使之成为新的栈顶
  • Pop (&S,&x): 出栈,若栈 S 非空,则弹出栈顶元素,并用 x 返回
  • GetTop (S,&x): 读栈顶元素,若栈 S 非空,则用 x 返回栈顶元素

其他常见操作: StackEmpty (S): 判断一个栈 S 是否为空,若 S 为空,则返回 true,否则返回 false

3. 顺序栈

详解数据结构中栈的定义和操作

3.1 顺序栈的定义

#define MaxSize 10 //定义栈中元素的最大个数  typedef struct{ ElemType data[MaxSize]; //静态数组存放栈中的元素 int top; //栈顶指针 }SqStack; //结构体重命名

声明一个顺序栈后就会在内存中分配一整片连续的空间,其中内存大小为:MaxSize*sizeof (ELemType)

void testStack(){
 SqStack S; //声明一个顺序栈 }

3.2 栈的初始化操作

由于栈顶指针 top 需要指向此时栈顶元素,所以让 top 指向 0 是不合理的,可以初始化让 top 指向 – 1; 判断一个栈是否为空,即判断 S.top 是否等于 – 1

初始化栈

void Inittack(SqStack){
 SqStack S; //声明一个顺序栈 S.top=-1;
}

判断栈空

bool StackEmpty(SqStack S){ if(S.top==-1) //栈空 return true; else return false; //非空 }

3.3 进栈操作

分析:

  1. 判断栈是否为空
  2. 栈顶指针 + 1
  3. 新元素入栈
bool Push(SqStack &S,ElemType x){ if(S.top==NaxSize-1) return false;
 S.top+=1;
 S.data[S.top]=x; return true;
}

3.4 出栈操作

bool Push(SqStack &S,ElemType &x){ if(S.top==-1) return false;
    x=S.data[S.top--]; return true;
}

3.5 读栈顶元素操作

bool GetTop(SqStack &S,ElemType &x){ if(S.top==-1) return false;
    x=S.data[S.top]; return true;
}

4. 共享栈

两个栈共享同一片空间

#define MaxSize 10 //定义栈中元素的最大个数  typedef struct{ ElemType data[MaxSize]; //静态数组存放栈中的元素 int top0; //0号栈栈顶指针 int top1; //1号栈栈顶指针 }SqStack; //结构体重命名 初始化栈: void InitStack(ShStack &S){
 S.top0=-1;
 S.top1=MaxSize;
}

5. 链栈的定义

  • 进栈 / 出栈都只能在栈顶一段进行
  • 链头作为栈顶
typedef struct Linknode{ ElemType data; //数据 struct Linknode *next; //指针域 }*LiStack //栈类型定义

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 详解数据结构中栈的定义和操作 https://www.zuozi.net/36204.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务