1 引子
2 栈的定义
3 栈的实现
3.1 栈类型定义
- 这里pdata应该是一个数组的指针,这个数组的空间我们在栈初始化的时候再申请
typedef int DataType;
typedef struct stack
{
DataType* pdata;
int top;
int capa;
}ST;
3.2 需要实现的接口
//栈的扩容
void CheckCapa(ST* pst);
//获取栈顶数据
DataType STTop(ST* pst);
//栈的判空
bool STEmpty(ST* pst);
//查看数据量
int STSize(ST* pst);
//栈的初始化
void STInit(ST* pst);
//栈的删除
void STDestroy(ST* pst);
//压栈
void STPush(ST* pst, DataType data);
//出栈
void STPop(ST* pst);
3.3 栈的初始化
- 我们一开始给栈申请4个元素的空间,后期不够我们再扩容
//栈的初始化
void STInit(ST* pst)
{
assert(pst);
pst->pdata = (DataType*)calloc(4, sizeof(DataType));
if (pst->pdata == NULL)
{
perror("STInit::calloc");
exit(1);
}
pst->top = -1;
pst->capa = 4;
}
3.4 栈的删除
//栈的删除
void STDestroy(ST* pst)
{
free(pst->pdata);
pst->pdata = NULL;
pst->capa = 0;
pst->top = -1;
}
3.5 栈的扩容
- 每次申请都让栈的capa翻2倍,防止频繁申请
//栈的扩容
void CheckCapa(ST* pst)
{
assert(pst);
if (pst->top + 1 == pst->capa)//满了才扩容,不满就不扩容
{
DataType* tmp = (DataType*)realloc(pst->pdata, 2 * pst->capa * sizeof(DataType)); //每次申请都让栈的capa翻2倍,防止频繁申请
if (tmp == NULL)
{
perror("CheckCapa::realloc");
exit(1);
}
else
{
pst->pdata = tmp;
}
pst->capa = 2 * pst->capa;//别忘了改变一下capa
}
}
3.6 获取栈顶数据
- 直接返回栈顶数据就行
//获取栈顶数据
DataType STTop(ST* pst)
{
assert(pst);
return pst->pdata[pst->top];
}
3.7 栈的判空
- 我们直接用表达式就行
//栈的判空
bool STEmpty(ST* pst)
{
assert(pst);
return pst->top + 1 == 0;//这个表达式的返回值就是true或者false
}
3.8 查看数据量
- 直接返回top+1就行
//查看数据量
int STSize(ST* pst)
{
assert(pst);
return pst->top + 1;
}
3.9 入栈
- 每次入栈的时候都要检查一下是不是满了
//入栈
void STPush(ST* pst, DataType data)
{
CheckCapa(pst);
(pst->top)++;
pst->pdata[pst->top] = data;
}
3.10 出栈
- 出栈的时候其实不需要删除元素,只需要让栈顶下移就行,下次入栈的时候直接就覆盖掉了,所以不需要手动删除元素
//出栈
void STPop(ST* pst)
{
if (STEmpty(pst))
{
return;
}
else
{
(pst->top)--;
}
}
完整实现代码
stack.h
//头文件申请
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <stdbool.h>
//类型定义
typedef int DataType;
typedef struct stack
{
DataType* pdata;
int top;
int capa;
}ST;
//函数定义
//栈的扩容
void CheckCapa(ST* pst);
//获取栈顶数据
DataType STTop(ST* pst);
//栈的判空
bool STEmpty(ST* pst);
//查看数据量
int STSize(ST* pst);
//栈的初始化
void STInit(ST* pst);
//栈的删除
void STDestroy(ST* pst);
//压栈
void STPush(ST* pst, DataType data);
//出栈
void STPop(ST* pst);
stack.c
//头文件申请
#include "stack.h"
//函数定义
//栈的扩容
void CheckCapa(ST* pst)
{
assert(pst);
if (pst->top + 1 == pst->capa)
{
DataType* tmp = (DataType*)realloc(pst->pdata, 2 * pst->capa * sizeof(DataType));
if (tmp == NULL)
{
perror("CheckCapa::realloc");
exit(1);
}
else
{
pst->pdata = tmp;
}
pst->capa = 2 * pst->capa;
}
}
//获取栈顶数据
DataType STTop(ST* pst)
{
assert(pst);
return pst->pdata[pst->top];
}
//栈的判空
bool STEmpty(ST* pst)
{
assert(pst);
return pst->top + 1 == 0;
}
//查看数据量
int STSize(ST* pst)
{
assert(pst);
return pst->top + 1;
}
//栈的初始化
void STInit(ST* pst)
{
assert(pst);
pst->pdata = (DataType*)calloc(4, sizeof(DataType));
if (pst->pdata == NULL)
{
perror("STInit::calloc");
exit(1);
}
pst->top = -1;
pst->capa = 4;
}
//栈的删除
void STDestroy(ST* pst)
{
free(pst->pdata);
pst->pdata = NULL;
pst->capa = 0;
pst->top = -1;
}
//压栈
void STPush(ST* pst, DataType data)
{
CheckCapa(pst);
(pst->top)++;
pst->pdata[pst->top] = data;
}
//出栈
void STPop(ST* pst)
{
if (STEmpty(pst))
{
return;
}
else
{
(pst->top)--;
}
}