• 25考研数据结构复习·3.1栈·顺序栈·链栈


    栈(Stack)基本概念

    数据结构三要素——逻辑结构、数据的运算、存储结构(物理结构)

    • 定义

      栈(Stack)只允许在一端进行插入或删除操作线性表

      逻辑结构:与普通线性表相同

      数据的运算:插入、删除操作有区别

    • 重要术语

      • 栈顶

        允许插入和删除的一端

      • 栈底

        不允许插入和删除的一端

      • 空栈

     

    • 基本操作

      • 创、销

        InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。

        DestroyStack(&L):销毁栈。销毁并释放栈S所占用的内存空间。

      • 增、删:只能在栈顶操作

        Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶

        Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。

        删除栈顶元素

      • 查:栈的使用场景中大多只访问栈顶元素

        GetTop(S,&x):读栈顶元素。若S非空,则用x返回栈顶元素。

        不删除栈顶元素

      • 其他常用操作

        StackEmpty(S):判断一个栈S是否为空。若S为空,则返回true,否则返回false

    • 常考题型

      进栈顺序: a → b → c → d → e

      有哪些合法的出栈顺序?

      • 结论

        n个不同元素进栈,出栈元素不同排列的个数为

    顺序栈的实现

    • 用顺序存储方式实现的栈

      • 定义

    1. #define MaxSize 10 //定义栈中元素的最大个数
    2. typedef struct{
    3. ElemType data[MaxSize] //静态数组存放栈中元素
    4. int top; //栈顶指针
    5. }SqStack; //Sq:sequence——顺序
    6. void testStack(){
    7. SqStack S; //声明一个顺序栈(分配空间)
    8. //……后续操作……
    9. }

     顺序存储:给各个数据元素分配连续的存储空间,大小为:MaxSize*sizeof(ElemType)

     

    • 基本操作

      • 创(初始化)

    1. #define MaxSize 10 //定义栈中元素的最大个数
    2. typedef struct{
    3. ElemType data[MaxSize] //静态数组存放栈中元素
    4. int top; //栈顶指针
    5. }SqStack; //Sq:sequence——顺序
    6. //初始化栈
    7. void InitStack(SqStack &S){
    8. S.top = -1; //初始化栈顶指针
    9. }
    10. void testStack(){
    11. SqStack S; //声明一个顺序栈(分配空间)
    12. //……后续操作……
    13. }
    14. //判断栈空
    15. bool StackEmpty(SqStack S){
    16. if(S.top == -1) //栈空
    17. return true;
    18. else
    19. return false;
    20. }

     增(进栈)

    1. #define MaxSize 10 //定义栈中元素的最大个数
    2. typedef struct{
    3. ElemType data[MaxSize] //静态数组存放栈中元素
    4. int top; //栈顶指针
    5. }SqStack;
    6. //新元素入栈
    7. bool Push(SqStack &S,ElemType x){
    8. if(S.top == MaxSize-1) //栈满,报错
    9. return false;
    10. S.data[++S.top] = x;
    11. return true;
    12. }

     删(出栈)

    1. #define MaxSize 10 //定义栈中元素的最大个数
    2. typedef struct{
    3. ElemType data[MaxSize] //静态数组存放栈中元素
    4. int top; //栈顶指针
    5. }SqStack;
    6. //出栈操作
    7. bool Pop(SqStack &S,ElemType &x){
    8. if(S.top == MaxSize-1) //栈空,报错
    9. return false;
    10. x = S.data[S.top]; //栈顶元素先出栈
    11. S.top = S.top -1; //指针再减1,数据还残留在内存中,只是逻辑上被删除了
    12. return true;
    13. }

     查(获取栈顶元素)

    1. #define MaxSize 10 //定义栈中元素的最大个数
    2. typedef struct{
    3. ElemType data[MaxSize] //静态数组存放栈中元素
    4. int top; //栈顶指针
    5. }SqStack;
    6. //出栈操作
    7. bool Pop(SqStack &S,ElemType &x){
    8. if(S.top == MaxSize-1) //栈空,报错
    9. return false;
    10. x = S.data[S.top--]
    11. return true;
    12. }
    13. //读栈顶元素
    14. bool GetTop(SqStack S,ElemType &x){
    15. if(S.top== -1) //栈空,报错
    16. return false;
    17. x = S.data[S.top]; //x记录栈顶元素
    18. return true;
    19. }

    另一种方式: 

    1. #define MaxSize 10 //定义栈中元素的最大个数
    2. typedef struct{
    3. ElemType data[MaxSize] //静态数组存放栈中元素
    4. int top; //栈顶指针
    5. }SqStack;
    6. //初始化栈
    7. void InitStack(SqStack &S){
    8. S.top = 0; //初始化栈顶指针(初始指向0
    9. }
    10. void testStack(){
    11. SqStack S; //声明一个顺序栈(分配空间)
    12. InitStack(S);
    13. //……后续操作……
    14. }
    15. //判断栈空
    16. bool StackEmpty(SqStack S){
    17. if(S.top ==0) //栈空
    18. return true;
    19. else
    20. return false;
    21. }
    22. //进栈
    23. S.data[S.top++]=x;
    24. //出栈
    25. x=S.data[--S.top];

    栈满条件:top == MaxSize

    缺点:栈的大小不可变


     共享栈(两个栈共享同一片空间)

    1. #define MaxSize 10 //定义栈中元素的最大个数
    2. typedef struct{
    3. ElemType data[MaxSize] //静态数组存放栈中元素
    4. int top0; //0号栈栈顶指针
    5. int top1; //1号栈栈顶指针
    6. }SqStack;
    7. //初始化栈
    8. void InitStack(SqStack &S){
    9. S.top0 = -1; //初始化栈顶指针
    10. S.top1 = MaxSize;
    11. }
    12. 满栈的条件:top0 + 1 = top1

     总结

     

    链栈的实现

    • 用链式存储方式实现的栈

      (头插法建立单链表)对头结点的后插操作 → 进栈

      (单链表的删除操作)对头结点的后删操作 → 出栈

      • 定义

    1. typedef struct Linknode{
    2. ElemType data; //数据域
    3. struct Linknode *next; //指针域
    4. }*LiStack; //栈类型定义

     基本操作参考单链表(创:初始化;增:进栈;删:出栈;查:获取栈顶元素)

  • 相关阅读:
    java计算机毕业设计江智能股票推荐系统MyBatis+系统+LW文档+源码+调试部署
    【MicroPython ESP32】通过sdcard模块读取SD卡实例
    PySide6实现pdf转化为word和长图片
    用于验证的verilog语法--1
    [GYCTF2020]Ezsqli-1|SQL注入
    Vue2进阶篇学习笔记
    模拟IIC通讯协议(stm32)(硬件iic后面在补)
    实战项目: 负载均衡
    分布式事务解决方案
    详解:网络虚拟化卸载加速技术的演进
  • 原文地址:https://blog.csdn.net/Annabelle___/article/details/136686704