006 数据结构_栈——“C”
前言
小留言:哈喽!各位CSDN的uu们,我是你的好友Fan_558,本文是Fan——数据结构与算法学习之路专栏的第6篇文章,本文采用数组的形式实现栈,希望我的文章可以给您带来一定的帮助
本文已通过如下测试用例,请放心学习哦!
void Test1()
{
Stack ps; //通过结构体类型创建结构体变量
StackInit(&ps); //初始化
StackPush(&ps, 1); //入栈
StackPush(&ps, 2); //入栈
printf("元素个数为:%d\n ", StackSize(&ps)); //获取元素个数
StackPush(&ps, 3); //入栈
StackPush(&ps, 4); //入栈
StackPush(&ps, 5); //入栈
while (!StackEmpty(&ps))
{
printf("%d ", StackTop(&ps));
StackPop(&ps); //出栈
}
printf("\n");
StackDestroy(&ps);
}
void Test2()
{
Stack ps; //通过结构体类型创建结构体变量
StackInit(&ps); //初始化
StackPush(&ps, 1); //入栈
StackPush(&ps, 2); //入栈
StackPush(&ps, 3); //入栈
StackPop(&ps); //出栈
StackPop(&ps); //出栈
printf("元素个数为:%d\n", StackSize(&ps)); //获取元素个数
StackPop(&ps); //出栈
printf("元素个数为:%d\n", StackSize(&ps)); //获取元素个数
//为空
// StackPop(&ps); //出栈
// printf("元素个数为:%d\n", StackSize(&ps)); //获取元素个数
StackDestroy(&ps);
}
int main()
{
Test1();
Test2();
return 0;
}
什么是栈
栈(Stack)是一种数据结构,它类似于一堆叠在一起的盘子,只能从最上面取出盘子,而不能从中间或底部取出。栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,即最后放入栈的元素最先被取出。栈通常有两个操作:push(压栈)和pop(出栈)。push操作会在栈的顶部添加一个元素,而pop操作则会在栈的顶部删除一个元素。
实现步骤
1、初始化——栈
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps)
{
ps->_a = NULL;
ps->_capacity = ps->_top = 0;
}
2、判空——栈
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps)
{
return ps->_top == 0;
}
解析:若ps->_top == 0返回true,否则返回false,这里注意下逻辑
assert(!StackEmpty(ps)); 若为0,返回true,!true为false。
为了提高这句代码的可读性,我们才这样写。
3、入栈
// 入栈
void StackPush(Stack* ps, STDataType data)
{
if (ps->_top == ps->_capacity) //扩容
{
STDataType newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
STDataType * tmp = (STDataType * )realloc(ps->_a, newcapacity * sizeof(Stack));
if (tmp == NULL)
{
perror("realloc fail"); //打印错误信息
return; //若开辟失败,程序结束
}
ps->_capacity = newcapacity;
ps->_a = tmp;
}
ps->_a[ps->_top] = data;
ps->_top++;
}
4、出栈
// 出栈
void StackPop(Stack* ps)
{
assert(ps);
assert(!StackEmpty(ps)); //判空,为假报错
ps->_top--;
}
5、获取有效元素个数——栈
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
assert(ps);
STDataType size = ps->_top;
return size;
}
6、销毁——栈
// 销毁栈
void StackDestroy(Stack* ps)
{
free(ps->_a);
ps->_a = NULL;
ps->_capacity = ps->_top = 0;
}
小结
倘若本文有遗漏疏忽之处,还需要你指正,以便今后改进!祝你天天开心啦!欢迎到我的博客留言,我会尽力解答,希望能给你一些帮助!