目录
1.栈数据类型的定义
typedef int STDataType; // 定义栈数据类型
typedef struct Stack // 定义栈结构
{
STDataType* arr; // 指向栈的指针
int _top; // 栈顶
int _capacity; // 容量
}Stack;
2.初始化栈
// 初始化栈
void StackInit(Stack* ps) // 初始化栈
{
ps->arr = NULL; // 将栈的指针设为空
ps->_capacity = 0; // 栈容量设为0
ps->_top = 0; // 栈顶设为0
}
3.销毁栈
// 销毁栈
void StackDestroy(Stack* ps) // 销毁栈
{
assert(ps); // 断言栈存在
free(ps->arr); // 释放栈的内存空间
ps->arr = NULL; // 将栈的指针设为空
ps->_capacity = 0; // 栈容量设为0
ps->_top = 0; // 栈顶设为0
}
4.入栈
// 入栈
void StackPush(Stack* ps, STDataType data) // 入栈操作
{
if (ps->_top == ps->_capacity) // 如果栈的元素个数等于栈的容量
{
ps->_capacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2; // 如果栈的容量为0,设为4;否则翻倍
ps->arr = (STDataType*)realloc(ps->arr, sizeof(STDataType) * ps->_capacity); // 重新分配内存空间
if (ps->arr == NULL) // 如果内存分配失败
{
perror("realloc"); // 打印错误信息
}
}
ps->arr[ps->_top] = data; // 将新元素入栈
ps->_top++; // 栈顶移动到新的位置
}
5.出栈
// 出栈
void StackPop(Stack* ps) // 出栈操作
{
if (ps->_top > 0) // 如果栈非空
{
ps->_top--; // 栈顶向下移动
}
else
{
printf("栈内已经没有元素了"); // 如果栈为空,打印提示信息
}
}
6.获取栈顶元素
// 获取栈顶元素
STDataType StackTop(Stack* ps) // 获取栈顶元素
{
return ps->arr[ps->_top - 1]; // 返回栈顶元素的值
}
7.获取栈中有效元素个数
// 获取栈中有效元素个数
int StackSize(Stack* ps) // 获取栈中元素个数
{
return ps->_top; // 返回栈顶位置(即栈中元素个数)
}
8. 检测栈是否为空
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps) // 检查栈是否为空
{
if (ps->_top > 0) // 如果栈非空
{
return ps->_top; // 返回栈中元素个数
}
else
{
return 0; // 如果栈为空返回0
}
}
9.打印栈
//打印栈
void StackPrint(Stack* ps) // 打印栈中元素
{
int i = 0; // 初始化循环变量
for (i = 0; i < ps->_top; i++) // 遍历栈中元素
{
printf("%d->", ps->arr[i]); // 打印元素值
}
printf("NULL"); // 打印结束标志
}