首先,栈是一个表,栈限制了插入和删除操作只能在一个位置上进行,这个位置是表的末端,所以栈是一种先进后出的数据结构
栈的实现非常简单,尤其是使用链表,只需要维护一个栈顶指针,入栈时将指针移到新加入的节点,出栈时将指针移到下一个节点
本文介绍栈的数组实现
实现思路:
1.维护一个栈顶索引
2.入栈时将索引 + 1
3.出栈时将索引 - 1
4.入栈和出栈前判断栈是否为满和空
代码实现
1.定义栈结构体:
typedef struct {
int *data; // 栈的实际内存空间,是一个数组
int top; //栈顶索引
int capacity; // 栈空间的大小
} stack;
2.初始化栈
void init_stack(stack *stack) {
stack->data = (int *)malloc(INITIAL_CAPACITY * sizeof(int)); // 分配空间
stack->top = -1; // 栈顶初始索引为-1
stack->capacity = INITIAL_CAPACITY; // 默认大小
}
3.动态扩容
void expand(stack* stack) {
stack->capacity *= 2;
// 增长栈空间,为原来的2倍
stack->data = (int *)relloc(stack->data, stack->capacity * sizeof(int));
}
4.入栈
void push(stack *stack, int value) {
if (stack->top == stack->capacity - 1) { // 空间是否足够
expand(stack); // 不够则扩容
}
stack->data[++stack->top] = value; // 入栈
}
5.出栈
int pop(stack *stack) {
if (is_empty(stack)) {
printf ("stack is empty now!\n");
exit(EXIT_FAILURE);
}
return stack->data[stack->top--];
}
6.销毁栈
void free_stack(stack *stack) {
free(stack->data);
stack->data = NULL;
stack->top = -1;
stack->capacity = 0;
}
7.测试
int main() {
stack stack;
init_stack(&stack);
push(&stack, 10);
push(&stack, 11);
push(&stack, 12);
push(&stack, 13);
printf("Top element is %d\n", peek(&stack));
printf("Popped element is %d\n", pop(&stack));
printf("Top element is now %d\n", peek(&stack));
free_stack(&stack);
return 0;
}
推荐学习 https://xxetb.xetslk.com/s/p5Ibb