自学B站小甲鱼数据结构课程-C语言实现基础数据结构-栈-的例子

看这个代码前,建议先看完小甲鱼栈数据结构那节课 栈数据结构讲解

我是第一次学数据结构这个课,这个数据结构课,对C语言水平要求还是有点高的,最基本的就是得熟悉指针,像结构体指针,还有C语言的数据类型了,基础的int char float,复杂点的 struct结构体,还有数据类型定义typedef,和宏定义,还有函数定义和调用,函数参数,形参,实参…,好在我之前有接近两年的嵌入式C语言编程经验,现在大三上初,之前学了51MCU,STM32MCU,基于这俩MCU做了些小项目,后边发现任务一但多了,在while(1){} 大循环里调整起来就很费劲了,就得上多任务操作系统了,然后这个暑假就学了学FreeRTOS,发现这个RTOS内核源代码的C语言,虽然也是C写的,但是我基本看不懂,STM32标准库是C写的那个还能看懂呢,可能是因为我只学了双向链表这个简单的数据结构,还差些其他数据结构的知识,我不是CS专业的,CS专业的内容只学了C语言,还有个单片机原理,没学过数据结构,所以看那个RTOS内核源代码直接给我整蒙了,然后了解过后OS,才意识到不学数据结构真不行了,不然真看着是C的数据类型和C语句,struct,int(i)(chars,int a),typedef,#define…但就是不知道这一段代码的含义

/**
 * @file statck.c
 * @author WLS
 * @brief 栈结构的实现 和入栈,出栈,清栈操作
 * @version 0.1
 * @date 2022-10-08
 * 
 * @copyright Copyright (c) 2022
 * 
 */
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>


#define Statck_Init_SIZE    3 //开始时候的栈空间大小 3个 栈单元 空间 =3 Byte

#define Statck_Add_SIZE     2 //要追加的栈空件大小 2个栈单元大小=2 Byte



/**
 * @brief 栈的结构,(一个虚拟的存储容器)
 * 一个栈 基础单元内存大小为 sizeof(char)= 1 Byte
 */
typedef struct 
{
    char *Top;  //栈顶指针
    char *Base;  //栈底指针
    int Statck_Size;//栈的存储容量  基础单元内存大小:4 Byte

}Statck_Type;






//-------------------函数声明区域----------------------

void Init_Stack(Statck_Type *s0);  //初始化栈

void Push(Statck_Type *s,char ele); //入栈操作 

void POP(Statck_Type *s,char ele); //出栈操作

void Pruge_Stack(Statck_Type *s); //清空一个栈

int detce_Stack_Size(Statck_Type *s); //检测栈空间大小

//-------------------函数声明区域----------------------




/**
 * @brief 主函数
 * 
 * @return int 返回值
 */
int main(void)
{



    return 0;
}





//-------------------函数定义区域----------------------

/**
 * @brief 初始化栈,栈基础单元大小为,1Byte
 * 
 * @param s0 栈成员地址
 */
void Init_Stack(Statck_Type *s0)
{
    /**
     * @brief 申请 Statck_Init_SIZE个栈单元的内存空间 
     *将申请到的内存空间的 起始地址赋值给栈底
     * 
     */
    s0->Base=(char *)malloc( Statck_Init_SIZE * sizeof(char) );

    if(s0->Base==NULL) return ; //如果申请失败 退出初始化函数

    s0->Top=s0->Base; //一开始时候 栈内单元未存储任何东西 所以栈顶指针和栈底指针相等
    s0->Statck_Size=Statck_Init_SIZE; //栈容量大小 等于用户定义的大小

}



/**
 * @brief 把数据 入栈 ,入栈之后  (栈顶地址)TOP+1
 * 
 * @param s 要放入栈 的地址
 * @param ele 要入栈的数据
 */
void Push(Statck_Type *s,char ele)
{

    //如果栈满了 栈顶地址 -栈顶地址大于等于栈内空间大小
    if( (s->Top-s->Base )>=s->Statck_Size )
    {
        //重新分配内存空间 在原来的基础上增加 Statck_Add_SIZE 2个栈单元大小 空间 2 * 4Byte
        s->Base=(char *)realloc(s->Base, sizeof(char)*(Statck_Init_SIZE+Statck_Add_SIZE) );
        if(s->Base==NULL) return;//申请空间失败 退出函数

        s->Top=s->Base+s->Statck_Size;//栈顶地址 还是等于上一次 结束时候的栈顶地址

        s->Statck_Size=s->Statck_Size+Statck_Add_SIZE;//新的栈空间大小为 原来的大小 加上新增加的大小

    }

    *s->Top=ele;//将数据放入栈顶中

    s->Top++;//栈顶地址+1

}



/**
 * @brief 将栈内单元中的数据 弹出来,出栈前 TOP先-1 再弹出栈地址内的数据
 * 
 * @param s 栈的地址
 * @param ele 将栈单元内 存储的数据放入到栈单元类型的变量中去
 */
void POP(Statck_Type *s,char ele)
{
    if(s->Base ==NULL) return;//如果栈内数据都被 完全弹出了 栈顶地址减到底了  则取消弹栈

    ele=*(--(s->Top));//栈顶地址先-1  再将栈内的数据 取出送入 ele变量中

}



/**
 * @brief 清空一个栈
 * 
 * @param s 栈结构成员的地址
 */
void Pruge_Stack(Statck_Type *s)
{
    if( s->Base != NULL )
    {
        free(s->Base);//释放栈的内存空间 
        s->Base=NULL ;//栈底地址清零
    } 
    
}



/**
 * @brief 检测栈的大小
 * 
 * @param s 栈结构成员的地址
 * @return int 栈的空间大小 单位:Byte
 */
int detce_Stack_Size(Statck_Type *s)
{
    if( s->Base != NULL )   return s->Statck_Size; //返回栈的大小
}

//-------------------函数定义区域----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值