数据结构简介

你好!欢迎来到计算机科学中最重要的一个章节。你可以把数据结构 (Data Structures) 想像成我们用来储存信息的“容器”。就像你不会把汤装进鞋盒,也不会把袜子塞进汤碗里一样,程序员会根据数据的处理需求来选择不同的数据结构。

在本指南中,我们将探讨如何组织数据,让程序运作得更顺畅、更有效率。如果一开始觉得有些概念很抽象,别担心——我们会通过大量生活中的例子来帮助你牢牢记住这些知识点!

1. 数组 (Arrays):井然有序的行列

数组 (Array) 是一组储存在同一个名称下,且数据类型相同的数据集合。想像学校走廊上一排排的储物柜,每个储物柜都有一个编号(索引,index),你可以在每个柜子里放进一件物品。

一维、二维和三维数组

课程大纲要求你理解最多三维的数组。让我们来拆解一下:

  • 一维数组 (1D Array / Linear): 一个简单的列表。例子:购物清单或一排储物柜。
  • 二维数组 (2D Array / Grid): 就像一张表格或棋盘。要找到特定的“柜子”,你需要行号和列号。例子:电子表格或电影院座位表。
  • 三维数组 (3D Array / Multi-layered): 就像堆叠起来的网格。想像一栋公寓大楼,你需要楼层、房间号码,以及该房间内的橱柜编号。
  • 重点: 在大多数编程语言中,我们从 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)(针对队列)。这能向考官证明你真正理解了当中的“指针”运作机制!