企业级开发 | C语言实现base64编码解码 | 附完整源码
在讲解代码前,我们先理解什么是“栈”。栈是一种特殊的“线性数据结构”,它的核心特点是“后进先出”(LIFO,Last In First Out)。 可以把栈想象成一摞盘子:
push
操作);pop
操作);我们用数组实现栈(数组实现简单直观,适合初学者理解),代码包含以下部分:
push
);pop
);#include <stdio.h>
#include <stdlib.h> // 用于动态内存分配(malloc、free)
// 1. 定义栈的结构体
typedefstruct {
int* data; // 用数组存储栈的元素
int top; // 栈顶指针(记录栈顶元素的位置,初始为-1表示空栈)
int capacity; // 栈的最大容量(最多能存多少元素)
} Stack;
// 2. 创建栈(初始化栈)
Stack* createStack(int capacity) {
// 为栈结构体分配内存
Stack* stack = (Stack*)malloc(sizeof(Stack));
if (stack == NULL) {
printf("内存分配失败!\n");
returnNULL;
}
// 初始化栈的容量
stack->capacity = capacity;
// 初始化栈顶指针(空栈时栈顶为-1)
stack->top = -1;
// 为存储元素的数组分配内存(大小为capacity)
stack->data = (int*)malloc(stack->capacity * sizeof(int));
if (stack->data == NULL) {
printf("数组内存分配失败!\n");
free(stack); // 释放已分配的栈结构体内存
returnNULL;
}
returnstack;
}
// 3. 入栈操作(push):将元素放入栈顶
void push(Stack* stack, int item) {
// 先检查栈是否已满(栈顶指针等于最大索引时满)
if (stack->top == stack->capacity - 1) {
printf("栈已满,无法入栈!\n");
return;
}
// 栈顶指针+1(移动到新的栈顶位置),再存入元素
stack->data[++stack->top] = item;
printf("元素 %d 入栈成功\n", item);
}
// 4. 出栈操作(pop):从栈顶取出元素
int pop(Stack* stack) {
// 先检查栈是否为空(栈顶指针为-1时为空)
if (stack->top == -1) {
printf("栈为空,无法出栈!\n");
return-1; // 用-1表示出栈失败(实际场景可根据需求调整)
}
// 先取出栈顶元素,再将栈顶指针-1(栈顶下移)
int item = stack->data[stack->top--];
printf("元素 %d 出栈成功\n", item);
return item;
}
// 测试代码
int main() {
// 创建一个容量为3的栈(最多存3个元素)
Stack* stack = createStack(3);
// 测试入栈
push(stack, 10); // 栈顶变为0,存储10
push(stack, 20); // 栈顶变为1,存储20
push(stack, 30); // 栈顶变为2,存储30
push(stack, 40); // 此时栈已满,会提示"栈已满"
// 测试出栈
pop(stack); // 取出30,栈顶变为1
pop(stack); // 取出20,栈顶变为0
pop(stack); // 取出10,栈顶变为-1(空栈)
pop(stack); // 此时栈为空,会提示"栈为空"
// 释放内存(避免内存泄漏)
free(stack->data);
free(stack);
return0;
}
Stack
)结构体是栈的“骨架”,包含3个核心成员:
int* data
:动态数组,用于实际存储栈的元素(用动态数组是为了让栈的容量可自定义);int top
:栈顶指针(本质是数组索引),记录当前栈顶元素的位置。初始值为-1(因为数组索引从0开始,-1表示“没有元素”,即空栈);int capacity
:栈的最大容量(比如capacity=3,表示最多能存3个元素)。createStack
函数)作用:初始化一个栈,为栈和存储元素的数组分配内存。 步骤:
malloc
为Stack
结构体分配内存(如果分配失败,提示错误并返回NULL
);capacity
);top = -1
,表示空栈);data
数组分配内存(大小为capacity * sizeof(int)
),如果失败则释放已分配的结构体内存(避免内存泄漏)。push
函数)作用:将元素添加到栈顶。 核心逻辑:
top == capacity - 1
(因为数组最大索引是capacity-1
,比如capacity=3时,最大索引是2)。如果满了,提示“栈已满”;top
加1(移动到新的栈顶位置),再将元素存入data[top]
(比如第一次入栈时,top从-1变为0,元素存在data[0]
)。pop
函数)作用:从栈顶取出元素并移除。 核心逻辑:
top == -1
(没有元素)。如果为空,提示“栈为空”并返回-1;data[top]
(栈顶元素),再将top
减1(栈顶下移,相当于移除元素),最后返回取出的元素。main
函数)我们创建了一个容量为3的栈,测试流程:
free
),避免内存泄漏。image
push
和pop
都只能操作栈顶元素;top
指针记录栈顶位置,capacity
限制最大容量;push
前必须检查栈满,pop
前必须检查栈空(否则会越界访问数组,导致程序崩溃);char
、float
等,只需修改结构体中data
的类型即可。通过这个实现,我们可以清晰地理解栈的基本操作原理,为后续学习更复杂的数据结构打下基础。
--完--