码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 3. 栈基本概念、【顺序栈、共享栈 和 链栈】代码实现


    文章目录

    • 栈的基本概念
    • 栈的基本操作
    • 卡特兰数
    • 顺序栈的实现
      • 1. 顺序栈的结构体:SqStack
      • 2. 顺序栈的初始化 :InitStack(SqStack &S)
      • 3. 入栈和判满 :Push(SqStack &S, ElemType x)
      • 4. 出栈和判空:Pop(SqStack &x, ElemType &x)
      • 5. 读取栈顶元素 :GetTop(SqStack S, ElemType &x)
      • 6.【混淆点】另一种实现方法:当初始化top=0时
    • 共享栈 (两个栈共享同一片空间):ShStack
    • 栈的链式存储实现【即链栈】
      • 1. 链栈的结构体【自己定义的】
      • 2. 链栈的初始化 :InitStack(StackLinkList &L)
      • 3. 判断栈是否为空:isEmpty(StackLinkList &L)
      • 4. 入栈【就是头插法】:pushStack(StackLinkList &L,ElemType x)
      • 5. 出栈:popStack(StackLinkList &L, int &x)

    栈的基本概念

    1. 栈(Stack)是只允许在一端进行插入或删除操作的线性表
    2. 栈顶:允许进行插入和删除的一端 (最上面的为栈顶元素)。
    3. 栈底:不允许进行插入和删除的一端 (最下面的为栈底元素)。
    4. 空栈:不含任何元素的空表。
    5. 特点:后进先出(后进栈的元素先出栈)、LIFO(Last In First Out)。
    6. 缺点:栈的大小不可变,解决方法:共享栈。

    在这里插入图片描述



    栈的基本操作

    在这里插入图片描述



    卡特兰数

    在这里插入图片描述



    顺序栈的实现

    使用数组来实现。其中下标为0的一端作为栈底,将数组尾部作为栈顶,以进行插入和删除
    使用一个变量top进行栈顶标识,top之外元素将不属于栈的定义范围

    在这里插入图片描述

    初始化使top=-1时,  空栈的判断条件为:top==-1  【常用】
    初始化使top=0时,  空栈的判断条件为:top==0,相应的增删也会有所不同
    
    具体不同看下面实现代码
    
    • 1
    • 2
    • 3
    • 4

    1. 顺序栈的结构体:SqStack

    sequence–>顺序的意思–>sq

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

    2. 顺序栈的初始化 :InitStack(SqStack &S)

    // 初始化栈
    void InitStack(SqStack &S){ 
        S.top = -1;                   //初始化栈顶指针
    }
    
    • 1
    • 2
    • 3
    • 4

    3. 入栈和判满 :Push(SqStack &S, ElemType x)

    只有入栈的时候,才会考虑是否满了
    先+1后赋值

    bool Push(SqStack &S, ElemType x){    
        if(S.top == MaxSize - 1)     // 判断栈是否已满       
            return false;    
        S.data[++S.top] = x;    
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. 出栈和判空:Pop(SqStack &x, ElemType &x)

    只有出栈的时候,才会考虑是否为空
    先赋值后-1

    bool Pop(SqStack &x, ElemType &x){    
        if(S.top == -1)        // 判断栈是否为空    
            return false;    
        x = S.data[S.top--];    
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5. 读取栈顶元素 :GetTop(SqStack S, ElemType &x)

    和pop( )唯一的不同是:没有-1

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



    6.【混淆点】另一种实现方法:当初始化top=0时

    在这里插入图片描述
    在这里插入图片描述



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

    #define MaxSize 10         //定义栈中元素的最大个数
    typedef struct{       
        ElemType data[MaxSize];       //静态数组存放栈中元素  
        int top0;                     //0号栈栈顶指针  
        int top1;                     //1号栈栈顶指针
    }ShStack;
    
    // 初始化栈
    void InitStack(ShStack &S){    
        S.top0 = -1;      //在外边
        S.top1 = MaxSize;   //在外边
    }
    
    //判断是否满
    top0 + 1 == top1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15



    栈的链式存储实现【即链栈】

    1. 链栈的结构体【自己定义的】

    typedef struct StackNode{        
        ElemType data;        //数据域    
        Linknode *next;       //指针域
    }StackNode,*StackLinkList;
    
    void testStack(){   
        StackLinkList L;            //声明一个链栈
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2. 链栈的初始化 :InitStack(StackLinkList &L)

    bool InitStack(StackLinkList &L){    
        L = (StackNode *)malloc(sizeof(StackNode));   
        if(L == NULL)             
            return false;   
        L->next = NULL;    
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3. 判断栈是否为空:isEmpty(StackLinkList &L)

    bool isEmpty(StackLinkList &L){    
        if(L->next == NULL)      
            return true;   
        else           
            return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. 入栈【就是头插法】:pushStack(StackLinkList &L,ElemType x)

    bool pushStack(StackLinkList &L,ElemType x){  
        StackNode *s = (StackNode *)malloc(sizeof(StackNode));  
        if(s == NULL)         
            return false;   
        s->data = x;     
        // 头插法      
        s->next = L->next;  
        L->next = s;     
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5. 出栈:popStack(StackLinkList &L, int &x)

    bool popStack(StackLinkList &L, int &x){     
        // 栈空不能出栈  
        if(L->next == NULL)     
            return false;    
        StackNode *s = L->next;  
        x = s->data;       
        L->next = s->next;
        free(s);       
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Vue将Element Plus 进行自定义封装
    嵌入式Linux系统编程 — 3.7 文件目录与处理
    Gradient Boosting
    考研数学|《1800》+《660》精华搭配混合用(经验分享)
    线程中的join()、wait() 和 notify()详解及练习题
    Mac安装nacos超详细步骤|解决打不开http://127.0.0.1:8848/nacos
    etcd MVCC 存储结构及流程
    元素的盒子模型+标签的尺寸大小和偏移量+获取页面滚动距离+JS直接修改标签样式 + 让页面滚动到指定位置
    操作系统启动过程
    m基于MATLAB Simulink的16QAM调制解调系统仿真
  • 原文地址:https://blog.csdn.net/weixin_42214698/article/details/126190795
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号