基本概念
栈(Stack)是一种后进先出(LIFO)原则的线性数据结构。核心操作包括:
- 压栈(Push):将元素添加到栈顶
- 出栈(Pop):移除并返回栈顶元素
- 查看栈顶(Check)获取但移除栈顶元素
- 判空(is_empty)检查栈是否为空
结构定义
使用动态数组实现栈,包含三个核心属性:
1 2 3 4 5
| typedef struct Stack { int* data; int top; int capacity; }
|
data
:动态分配的数组指针
top
:初始值为-1,表示空栈,压栈时递增,出栈时递减
capacity
:栈的容量上限
功能实现
初始化
1 2 3 4 5 6 7 8 9 10 11 12 13
| void init_stack(Stack *s, int capacity) { s -> data = (int*)malloc(sizeof(int) * capacity) if(!s -> data) { printf("内存分配失败!\n"); exit(1); } s -> top = -1; s -> capacity = capacity; }
|
这个函数中进行了动态分配内存计算最大容量,初始化赋值和异常处理。
压栈(Push)
1 2 3 4 5 6 7 8
| void push(Stack *s, int value) { if (s -> top = s -> capacity -1) { printf("栈已满!\n"); return; } s -> data[++s->top] = value; }
|
检查栈是否已满,先递增指针再存入数据
出栈(Pop)
1 2 3 4 5 6 7 8
| int pop(Stack *s) { if(is_empty(s)) { printf("栈为空!\n"); return -1; } return s->data[s->top--]; }
|
检查栈是否为空,返回当前栈顶元素后移动指针
辅助功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int is_empty(Stack *s) { return s-> top == -1 }
int peek(Stack *s) { return is_empty(s) ? -1 : s->data[s->top]; }
void destory_stack(Stack *S) { free(s->data); s -> top = -1; s -> capacity = 0; }
|