什么是数据结构
打开手机上的通讯录,输入一个名字,瞬间就能找到对应的号码。这个看似简单的操作背后,其实依赖着一种叫“数据结构”的设计。数据结构就是计算机存储、组织数据的方式。不同的结构决定了数据访问、插入、删除的效率。
比如你有一堆书要整理。如果随便堆在桌上,找一本可能得翻半天;但如果按书名首字母排好放在书架上,查找就快多了。数据结构的作用,就是帮你决定这些“书”该怎么放。
常见的基础数据结构
刚开始学编程时,最常接触的是数组和链表。它们都用来存一组数据,但方式完全不同。
数组就像一排整齐的储物格,每个位置都有编号(下标),你可以直接通过编号取东西。比如定义一个存放成绩的数组:
int scores[5] = {85, 92, 78, 96, 88};想看第三个成绩,直接用 scores[2] 就行(下标从0开始)。但问题来了,如果想在中间插一门新科目,就得把后面的成绩全往后挪,挺麻烦。
链表则像一串钥匙环,每块数据带着下一个数据的“线索”。它不追求连续存放,插入删除更灵活。比如新增一个节点,只要改改指针:
struct Node {
int data;
struct Node* next;
};
// 插入新节点
newNode->next = current->next;
current->next = newNode;虽然插入方便,但想查第5个元素?不好意思,得从头一个一个数过去。
栈和队列:生活中的排队与收纳
栈是“后进先出”的结构,像你家厨房的碗碟架——最后洗的碗总被放在最上面,下次用也是先拿最上面的。程序里的函数调用就是靠栈实现的,每次进入新函数就压栈,执行完再弹出来。
队列正好相反,是“先进先出”,像超市结账排队。最早来的顾客先被服务。操作系统处理任务、打印队列都是这么干的。
树:让数据有层次
文件夹嵌套文件夹,这种层级关系用树来表示最合适。树的顶端是根目录,往下分出子目录,层层展开。二叉树是一种特殊树,每个节点最多有两个分支。
比如你要做一个学生成绩查询系统,用二叉搜索树能让查找更快。左边的节点比当前小,右边的比当前大。这样找一个分数,每次都能排除一半的数据。
struct TreeNode {
int value;
struct TreeNode* left;
struct TreeNode* right;
};如何开始练习
别一上来就啃理论。试着写个小程序:比如用数组实现一个待办事项列表,支持添加、删除、查看。然后换成链表再写一遍,体会两者的差异。再试试用栈模拟浏览器的“返回”功能,或者用队列模拟银行叫号系统。
动手过程中遇到问题,自然会去查资料、看别人怎么设计。这才是真正的入门路径。