如果你刚打开一本《数据结构(C语言版)》,或者刚下载了王卓老师的课件,大概率脑子里会冒出一个问题:数据结构到底是个什么东西?是背代码?是刷算法题?还是某种数学课的表亲?
这篇是这个系列的第一篇,我打算先不丢定义,而是用大白话把“数据结构”这四个字讲透。它的目标读者很明确:正在学这门课却总感觉“听得懂、不会用”的在校生,准备考研408、软考、期末复习的同学,以及那些编程写了两三年、却一直没系统补过底子的开发者。读完这篇,你脑中应该能建立一张完整的地图:数据结构解决什么问题、里面有哪些内容、不同模块之间的关系是什么。
1. 数据结构到底是什么:用生活例子30秒理解核心概念
1.1 先从一个常见场景说起
想象你去一家没有预约、没有叫号系统的银行排队办事。所有人挤在大厅里,谁先到谁靠前,后面的人不断补上来,办完的人离开。这种“先来先服务”的规则,其实就是一种数据结构,它的学名叫“队列”。
再换一个场景。你想在一堆堆满旧书的书架上找一本《三体》。如果书是无序乱放的,你可能要翻遍整个书架;如果书按类别摆放,文学区、历史区、计算机区各自分开,你就能直接走到对应区域去找。这里“按什么规则摆放”本身就是一种数据组织方式。
程序处理数据也是这个道理。数据不是凭空存在的,它需要被组织起来,而组织方式会直接影响你找数据、加数据、删数据的效率。数据结构研究的,就是数据应该用什么关系组织、怎么在电脑里存放、以及支持哪些操作。
1.2 拆开看:数据+结构,到底在学什么
“数据结构”可以拆成两个词来理解。
数据,指的是能输入到计算机里、能被程序处理的符号集合。数字是数据,文本是数据,图片、音频、视频在计算机内部也是一串数据。程序处理数据时,不会拿着整本书去处理,而是以“数据元素”为单位。比如学生管理系统里,一个学生是一条记录,这条记录是一个数据元素;记录里的学号、姓名、成绩,就是更小的“数据项”。用表格来类比,数据元素是一行,数据项是行里的单元格。
结构,指的是数据元素之间的关系。同样是全班30名同学,如果按学号排成一列,这是一种关系;如果按班级分支、组别划分,又是另一种关系。计算机里处理的数据千变万化,但元素之间的基本关系可以归纳为几大类,这就是后文会展开的逻辑结构。
所以数据结构这门课,本质上是在回答三个问题:数据元素之间是什么关系、数据在内存里怎么摆、能在这些数据上做什么操作。
1.3 逻辑结构和存储结构,千万别混为一谈
这是新手最容易绕晕的一对概念,我先用一句话点破:逻辑结构是你“想让它长什么样”,存储结构是它在内存里“实际怎么放”。
比如家庭关系。你脑子里有一张家族谱系图,爷爷下面有父亲、叔伯,父亲下面有你,这叫逻辑上的树形关系。但实际生活中,一家人可能住同一个屋檐下,也可能分散在几个城市,靠电话、视频联系,这叫物理上的联系方式。前者是逻辑结构,后者是存储结构。
计算机中常见的存储结构有四种:顺序存储、链式存储、索引存储、散列存储。
- 顺序存储:把数据放在一段连续的内存空间里,就像一个班同学坐成一长排,逻辑上相邻的两个人,物理位置也相邻。数组就是典型代表,取某个位置的人特别快,但中间插一个人就很麻烦,后面所有人都得挪位。
- 链式存储:每个数据元素除了存自己,还会额外存一个“线索”,告诉程序下一个元素在哪里。这就像寻宝游戏,每张纸条上写着下一张纸条的藏匿位置。插入删除灵活,但想找中间的某个人,只能从头顺着线索找。
- 索引存储:额外建一张目录表,就像查字典先查偏旁目录,能快速定位到目标区域。
- 散列存储:根据数据本身算出一个位置,直接把数据丢进去,读取时再按同样规则去取。像是每个快递柜根据手机尾号决定放哪个柜门,不需要挨个找。
你后面学的每一种数据结构,比如线性表、树、图,都需要同时考虑这两个维度。同一个逻辑结构,可以选择不同的存储方式,效果差别很大。
1.4 数据结构三要素:逻辑结构、存储结构、数据运算
很多教材会直接告诉你:数据结构包含逻辑结构、存储结构和数据运算三个方面。这九个字看起来很抽象,其实对应一个很实际的思考链。
