看这个代码前,建议先看完小甲鱼栈数据结构那节课 栈数据结构讲解
我是第一次学数据结构这个课,这个数据结构课,对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; //返回栈的大小
}
//-------------------函数定义区域----------------------