数据结构简介
你好!欢迎来到计算机科学中最重要的一个章节。你可以把数据结构 (Data Structures) 想像成我们用来储存信息的“容器”。就像你不会把汤装进鞋盒,也不会把袜子塞进汤碗里一样,程序员会根据数据的处理需求来选择不同的数据结构。
在本指南中,我们将探讨如何组织数据,让程序运作得更顺畅、更有效率。如果一开始觉得有些概念很抽象,别担心——我们会通过大量生活中的例子来帮助你牢牢记住这些知识点!
1. 数组 (Arrays):井然有序的行列
数组 (Array) 是一组储存在同一个名称下,且数据类型相同的数据集合。想像学校走廊上一排排的储物柜,每个储物柜都有一个编号(索引,index),你可以在每个柜子里放进一件物品。
一维、二维和三维数组
课程大纲要求你理解最多三维的数组。让我们来拆解一下:
- 一维数组 (1D Array / Linear): 一个简单的列表。例子:购物清单或一排储物柜。
- 二维数组 (2D Array / Grid): 就像一张表格或棋盘。要找到特定的“柜子”,你需要行号和列号。例子:电子表格或电影院座位表。
重点: 在大多数编程语言中,我们从 0 而不是 1 开始计数。这称为零基索引 (Zero-based indexing)。因此,数组中的第一项是在索引 \(0\) 的位置。
快速回顾:数组特性
1. 它们储存相同类型的数据(例如:全都是整数)。
2. 它们具有固定的大小(一旦建立,通常无法更改“储物柜”的数量)。
3. 如果你知道索引,你可以瞬间存取任何项目。
2. 记录 (Records):数字身份证
虽然数组非常适合处理一系列相同的数据(例如 100 个价格),但当你想要储存关于“某个特定事物”的不同类型数据时,就会使用记录 (Record)。
想像一个学生记录,它可能包含:
- 学号 (StudentID): 整数 (例如:5021)
- 姓名 (Name): 字符串 (例如:"Alice")
- 是否入学 (IsEnrolled): 布尔值 (例如:True)
记录中的每一项独立信息称为字段 (Field)。
类比: 把记录想像成实体档案柜中的一张卡片,它保存了关于某个人或对象的所有不同类型的信息。
3. 列表 (Lists) 与元组 (Tuples)
它们看起来可能像数组,但有一些“个性”上的差异:
列表 (Lists)
列表 (List) 比数组更灵活。与数组不同的是,列表在程序执行时通常可以随意增加或缩小容量。它们是可变的 (Mutable),这是一个专业术语,意思是它们的内容可以被修改。
元组 (Tuples)
元组 (Tuple) 是一种不可变的 (Immutable) 列表——一旦建立就不能更改。
为什么要用元组? 因为更安全!如果你有一些绝对不应该被更改的数据(例如固定的地标坐标,或是某种特定颜色的 RGB 数值),将它们放入元组可以防止意外修改。
记忆小撇步: Tuples(元组)是被 Trapped(困住的/锁定的),所以它们无法改变!
4. 堆栈 (Stacks):后进先出结构
堆栈 (Stack) 是一种最后放入的项目最先被取出的数据结构。我们称之为 LIFO (Last-In, First-Out)。
日常类比: 想像自助餐厅的托盘堆,或者一罐品客薯片。你只能拿走最上面的托盘,也只能把新的托盘叠在最上面。
堆栈操作
- Push (推入): 将项目加入堆栈的顶部。
- Pop (弹出): 将堆栈顶部的项目移出。
- Peek (窥视): 查看顶部的项目而不将其移出。
你知道吗? 电脑上的“撤销 (Undo)”按钮就是使用堆栈!你执行的每一个动作都会被 push 到堆栈中。当你按下撤销时,电脑会从顶部 pop 出最后一个动作来撤销它。
快速回顾:堆栈逻辑
如果你将 A、然后 B、然后 C 推入 (push) 堆栈,你第一个“弹出 (Pop)”出来的项目将会是 C。
5. 队列 (Queues):先进先出结构
队列 (Queue) 与堆栈恰恰相反。它遵循 FIFO (First-In, First-Out) 规则。第一个加入队伍的人就是第一个获得服务的人。
日常类比: 超级市场的结账队伍,或者是过山车的排队队伍。
队列操作
- Enqueue (加入队列): 将项目加入队列的后方 (rear)。
- Dequeue (移出队列): 从队列的前方 (front) 移除一个项目。
常见错误: 学生常会搞混项目的进出位置。只要记住现实生活中的排队:你在后面加入 (Enqueue),轮到你时从前面离开 (Dequeue)!
重点总结:堆栈 vs. 队列
堆栈 (Stack) = LIFO (后进先出)
队列 (Queue) = FIFO (先进先出)
总结与成功小技巧
如果这些术语现在听起来只是“名词”也不要担心。学习它们的最佳方式是思考数据是如何移动的:
- 使用数组 (Array) 来处理固定大小、相同类型的列表。
- 使用记录 (Record) 来将关于同一个事物的不同信息分组。
- 使用元组 (Tuple) 来储存必须保持“锁定”且不可更改的数据。
- 使用堆栈 (Stack) 当你需要记住“最近发生”的事情时(例如“撤销”功能)。
- 使用队列 (Queue) 当你需要按照“到达顺序”来处理事务时(例如打印机打印文件)。
最后的小贴士: 在考试中绘制堆栈或队列时,请务必清楚标记顶部 (Top)(针对堆栈)或前方与后方 (Front and Rear)(针对队列)。这能向考官证明你真正理解了当中的“指针”运作机制!