hello,我是~小鹿,对你有帮助可以收藏随时找到这里哦
【C语言版数据结构】栈的接口函数代码
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
栈的实现:栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
栈的基本结构:
typedef int STDataType;//类型重命名 方便更改数据类型
typedef struct Stack
{
STDataType* a;//数组
int top;//代表数据个数
int capacity;//容量
}ST;
初始化 StackInit
void StackInit(ST* ps)//初始化
{
assert(ps);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
销毁 StackDestroy
void StackDestroy(ST* ps)//销毁
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
入栈 StackPush
void StackPush(ST* ps, STDataType x)//插入 入栈
{
assert(ps);
if (ps->top == ps->capacity)//当容量不足时扩容
{
int newCapacity = ps->capacity == 0 ? 4 : (ps->capacity) * 2;
ST* tmp = realloc(ps->a, sizeof(STDataType) * 2);
if (tmp == NULL)//若为空 则开辟失败
{
printf("realloc fail\n");
exit(-1);
}
ps->a = tmp;
ps->capacity = newCapacity;
}
ps -> a[ps->top] = x;//入栈
ps->top++;
}
出栈 StackPop
void StackPop(ST* ps)//出栈 即删除栈顶数据
{
assert(ps);
assert(ps->top > 0);//数组不为空,否则多次删除会出问题
ps->top--;
}
获取栈顶元素 StackTop
STDataType StackTop(ST* ps)//取栈顶的数据
{
assert(ps);
assert(ps->top > 0);//或者调用 assert(! StackEmpty(ps));//判断数组是否为空
return ps->a[ps->top - 1];//top-1是数组下标
检测栈是否为空,如果为空返回非零结果,如果不为空返回0 StackEmpty
bool StackEmpty(ST* ps)//判断栈是否为空
{
assert(ps);
return ps->top == 0;
}
主函数运行示例
void TestStack()
{
ST st;
StackInit(&st);//初始化
StackPush(&st, 1);//入栈
StackPush(&st, 2);
StackPush(&st, 3);
StackPush(&st, 4);
//此时栈中数据为1 2 3 4 (4为栈顶)
//测试出栈(后进先出,出的时栈顶)
printf("%d ", StackTop(&st));//输出栈顶元素 4
StackPop(&st);//输出之后要删除栈顶 即出栈
printf("%d ", StackTop(&st));//取栈顶元素 3
StackPop(&st);//删除栈顶元素3
printf("\n");
//此时栈中数据为1 2
StackPush(&st, 5);//入栈
StackPush(&st, 6);
//此时栈中数据为1 2 5 6(6为栈顶)
while (!StackEmpty(&st))//打印栈
{
printf("%d ", StackTop(&st));//打印栈顶数据
StackPop(&st);//打印一个删一个 保持后进先出
}
//后进先出 先打印 6 然后打印 5 以此类推 打印结果应为 6 5 2 1
StackDestroy(&st);//结束后记得销毁栈
}
int main()
{
TestStack();
return 0;
}
运行结果