写程序就像搭积木,而数据结构就是那些最基础的积木块。你在刷网页、点外卖、看视频的时候,背后其实都在用这些结构默默支撑。了解它们怎么实现,能帮你更清楚地理解软件是怎么跑起来的。
数组:最直接的存储方式
数组就像是整齐排列的一排抽屉,每个位置都有编号,你可以快速找到第3个或第10个里面装了啥。它在内存里连续存放,读取速度快,但想中间插个新数据就得挪动后面所有元素。
int arr[5] = {10, 20, 30, 40, 50};
// 直接通过下标访问
int third = arr[2]; // 得到30
链表:灵活的“接力队”
链表不像数组那样站成一排,而是像一群人手拉手,每个人只知道下一个是谁。你可以在任意位置插入新成员,只要断开手再接上就行,不用移动整队人。
struct Node {
int data;
struct Node* next;
};
// 创建一个节点
struct Node* head = (struct Node*)malloc(sizeof(struct Node));
head->data = 100;
head->next = NULL;
栈:后进先出的“叠盘子”
想象餐厅洗碗工叠盘子,最后放上去的总是第一个被拿走。浏览器的“返回”按钮就是靠栈实现的,每点一个新页面就压进栈里,点返回就弹出上一个。
# 使用数组模拟栈
int stack[100];
int top = -1;
// 入栈
stack[++top] = 25;
// 出栈
int value = stack[top--];
队列:排队买奶茶的逻辑
队列是先进先出,就像你排队买奶茶,第一个来的第一个买到。系统任务调度、消息传递都用这种结构,保证顺序不乱套。
int queue[100];
int front = 0, rear = 0;
// 入队
queue[rear++] = 30;
// 出队
int item = queue[front++];
哈希表:快速查找的“电话簿”
你想找“张伟”的电话,不会一页页翻通讯录,而是直接翻“Z”开头的部分。哈希表就是干这个的,把名字转成位置索引,实现接近秒开的查找速度。登录验证、缓存系统都离不开它。
#define TABLE_SIZE 10
int hash_table[TABLE_SIZE];
int hash(int key) {
return key % TABLE_SIZE;
}
// 存数据
hash_table[hash(123)] = 999; // 把999存到对应位置
树:分层管理的“组织架构图”
公司有CEO、部门经理、小组长,一层管一层,这就是树形结构。二叉搜索树让数据自动排序,查找效率比线性结构高不少。文件夹的嵌套目录也是树的应用。
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = 50;
root->left = NULL;
root->right = NULL;