网站做优化公司,公司起名吉祥字大全,建设一个收入支出持平的网站,成都建模培训机构目录 1.栈1.1栈的概念及结构1.2 栈的实现1.1.0 栈的初始化1.1.1 销毁1.1.2 入栈1.1.3 出栈1.1.4 获取栈中有效元素个数1.1.5 检测栈是否为空#xff0c;如果为空返回非零结果#xff0c;如果不为空返回01.1.6 获取栈顶元素1.1.7 验证 附录 栈的C语言实现源码.h文件.c文件test… 目录 1.栈1.1栈的概念及结构1.2 栈的实现1.1.0 栈的初始化1.1.1 销毁1.1.2 入栈1.1.3 出栈1.1.4 获取栈中有效元素个数1.1.5 检测栈是否为空如果为空返回非零结果如果不为空返回01.1.6 获取栈顶元素1.1.7 验证 附录 栈的C语言实现源码.h文件.c文件test.c文件 1.栈
1.1栈的概念及结构
栈一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶另一端称为栈底。栈中的数据元素遵守后进先出LIFOLast In First Out的原则。
压栈栈的插入操作叫做进栈/压栈/入栈入数据在栈顶。出栈栈的删除操作叫做出栈。出数据也在栈顶 1.2 栈的实现
在VS2022中新建一个工程
stack20250308.h栈的类型定义、接口函数声明、引用的头文件stack20250308.c栈的接口函数的实现stackTest20250308.c主函数、测试各个接口功能 实现接口
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;// 初始化栈
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);
// 入栈插入
void STPush(ST* ps, STDataType x);
// 出栈删除
void STPop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空如果为空返回非零结果如果不为空返回0
bool STEmpty(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);1.1.0 栈的初始化 // 初始化栈
void STInit(ST* ps)
{assert(ps);ps-a (STDataType*)malloc(sizeof(STDataType)*4);if (ps-a NULL){perror(STInit::malloc fail!);return;}ps-capacity 4;ps-top 0;//top是栈顶元素的下一个位置//ps-top -1;//top是栈顶元素位置
}1.1.1 销毁
//销毁
void STDestroy(ST* ps)
{assert(ps);free(ps-a);ps-a NULL;ps-capacity 0;ps-top 0;
}1.1.2 入栈
// 入栈插入
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps-top ps-capacity){STDataType* tem (STDataType*)realloc(ps-a,sizeof(STDataType) * ps-capacity*2);//扩容当前的2倍if (ps-a NULL){perror(STInit::relloc fail!);return;}ps-a tem;ps-capacity * 2; //修改容量}ps-a[ps-top] x;ps-top;
}1.1.3 出栈
// 出栈删除
void STPop(ST* ps){assert(ps);assert(!STEmpty(ps));//检查是否为空为空就报错ps-top--;//直接--但是空栈的时候就不能继续--所以在之前进行是否为空的检查。
}1.1.4 获取栈中有效元素个数
//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);//top就是sizereturn ps-top;
}1.1.5 检测栈是否为空如果为空返回非零结果如果不为空返回0
//检测栈是否为空如果为空返回非零结果如果不为空返回0
bool STEmpty(ST* ps)
{assert(ps);return ps-top 0;
}1.1.6 获取栈顶元素
//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);return ps-a[ps-top - 1];//top是最后一个元素的下一个位置所以-1
}1.1.7 验证
验证的时候我们栈是不能打印的我们需要一个一个出栈打印栈顶元素
void STTest()
{ST st;STInit(st);STPush(st, 1);STPush(st, 2);STPush(st, 3);STPush(st, 4);STPush(st, 5);while (!STEmpty(st)){printf(%d , STTop(st));STPop(st);}STDestroy(st);}插入 删除 栈有效个数验证 附录 栈的C语言实现源码
.h文件
#pragma once
#includestdio.h
#includestdbool.h
#includestdlib.h
#includeassert.h//静态的
//#define N 10
//typedef struct Stack
//{
// int a[N];
// int top;
//
//}Stack;// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
// 初始化栈
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);
// 入栈插入
void STPush(ST* ps, STDataType x);
// 出栈删除
void STPop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空如果为空返回非零结果如果不为空返回0
bool STEmpty(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#includestack20250308.h// 初始化栈
void STInit(ST* ps)
{assert(ps);ps-a (STDataType*)malloc(sizeof(STDataType)*4);if (ps-a NULL){perror(STInit::malloc fail!);return;}ps-capacity 4;ps-top 0;//top是栈顶元素的下一个位置//ps-top -1;//top是栈顶元素位置
}//销毁
void STDestroy(ST* ps)
{assert(ps);free(ps-a);ps-a NULL;ps-capacity 0;ps-top 0;
}
// 入栈插入
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps-top ps-capacity){STDataType* tem (STDataType*)realloc(ps-a,sizeof(STDataType) * ps-capacity*2);//扩容当前的2倍if (ps-a NULL){perror(STInit::relloc fail!);return;}ps-a tem;ps-capacity * 2; //修改容量}ps-a[ps-top] x;ps-top;
}
// 出栈删除
void STPop(ST* ps){assert(ps);assert(!STEmpty(ps));//检查是否为空为空就报错ps-top--;//直接--但是空栈的时候就不能继续--所以在之前进行是否为空的检查。
}//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);//top就是sizereturn ps-top;
}
//检测栈是否为空如果为空返回非零结果如果不为空返回0
bool STEmpty(ST* ps)
{assert(ps);return ps-top 0;
}
//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);return ps-a[ps-top - 1];//top是最后一个元素的下一个位置所以-1
}test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#includestack20250308.hvoid STTest()
{ST st;STInit(st);STPush(st, 1);STPush(st, 2);STPush(st, 3);STPush(st, 4);STPush(st, 5);STPop(st);STPop(st);int size STSize(st);printf(栈有效元素为%d\n, size);while (!STEmpty(st)){printf(%d , STTop(st));STPop(st);}STDestroy(st);
}int main()
{STTest();return 0;
}