声明部分stack.h:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef int STDataType;
typedef struct STNode
{
STDataType* a;
int top;
int capacity;
}node;
void StackInit(node* stack);
void StackDestroy(node* stack);
void StackPush(node* stack, STDataType x);
void StackPop(node* stack);
STDataType StackTop(node* stack);
int StackSize(node* stack);
函数实现部分stack.c:
初始化函数:
void StackInit(node* stack)
{
assert(stack);
stack->a = NULL;
stack->top = 0;
stack->capacity = 4;
stack->a = (STDataType*)malloc(sizeof(STDataType) * stack->capacity);
if (stack->a == NULL)
{
perror("malloc fail");
exit(-1);
}
}
销毁函数:
void StackDestroy(node* stack)
{
assert(stack);
free(stack->a);
stack->a = NULL;
stack->top = stack->capacity = 0;
}
入栈函数:
void StackPush(node* stack, STDataType x)
{
assert(stack);
//这里在入栈之前要先判断是否满,如果满了要先进行扩容
if (stack->top == stack->capacity)
{
//这里扩容逻辑和顺序表一样,扩二倍容量
STDataType* temp = (STDataType*)realloc(stack->a, sizeof(STDataType) * stack->capacity * 2);
if (temp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
stack->a = temp;
stack->capacity *= 2;
}
// 这里我定义的栈顶是指下一个元素
stack->a[stack->top] = x;
stack->top++;// 栈顶上移一格
}
出栈函数:
void StackPop(node* stack)
{
assert(stack);
//这里出栈前要先判断是否已经是空了
assert(stack->top > 0);
stack->top--;//这里只需要将栈顶向下移动一格就行,如果后面再有元素直接覆盖就行
}
获取栈顶元素:
STDataType StackTop(node* stack)
{
assert(stack);
assert(stack->top > 0);
return stack->a[stack->top - 1];
}
获取栈大小函数:
STDataType StackTop(node* stack)
{
assert(stack);
assert(stack->top > 0);
return stack->a[stack->top - 1];
}
测试部分test.c :
#define _CRT_SECURE_NO_WARNINGS
#include "stack.h"
int main()
{
node stack;
StackInit(&stack); // 初始化栈
StackPush(&stack, 1);
StackPush(&stack, 2);
StackPush(&stack, 3);
StackPush(&stack, 4);
// 打印栈顶元素并出栈
while (StackSize(&stack) > 0)
{
printf("%d ", StackTop(&stack));
StackPop(&stack);
}
printf("\n");
StackDestroy(&stack); // 销毁栈
return 0;
}