【软件设计师】数据结构
1. 数据结构
1.1 表达式求值
中缀表达式求值:利用操作数栈与运算符栈,从左到右扫描表达式,
-
遇操作数,直接入操作数栈。
-
遇左括号,直接入运算符栈。
-
遇右括号,循环出栈计算,直到弹出左括号。
-
遇运算符:
- 若栈空、栈顶为左括号、或当前优先级 > 栈顶优先级,则直接入栈。
- 否则,循环出栈计算,直到满足上述入栈条件。
-
最终,操作数栈顶即为结果。


**后缀表达式(逆波兰表达式)**求值:
-
从左到右扫描表达式。
-
遇到操作数,则将其压入栈。
-
遇到运算符,则从栈中弹出两个操作数,按运算符进行计算,并将结果压回栈中。
重复上述过程,直到表达式结束。栈中剩下的最后一个数就是结果。

前缀表达式求值算法规则:
-
从右到左扫描表达式。
-
遇到操作数,则将其压入栈。
-
遇到运算符,则从栈中弹出两个操作数,按运算符进行计算,并将结果压回栈中。
注意:对于减法和除法,先弹出的是左操作数,后弹出的是右操作数,顺序与后缀表达式相反。
重复上述过程,直到表达式开始。栈中剩下的最后一个数就是结果。

1.2 递归算法时间复杂度

2. 哈夫曼编码
3. 编译过程
4. 软件工程
数据流和数据存储:
- 数据流:数据在系统中流动的路径,代表了数据的传递和处理过程,如用户请求。
- 数据存储:利用介质将数据持久化保存机制,是静态的,如挂号记录。
内聚类型:
- 顺序内聚:模块内各部分必须顺序执行,且前一部分的输出是后一部分的输入。
- 功能内聚:模块内各部分共同完成一个单一的功能,不可再分。
- 通信内聚:模块内各部分因处理同一份数据而聚集到一起。
- 巧合内聚:模块内各部分之间没有任何联系,只是偶然凑到一起。
软件开发模型:
-
瀑布模型:必须完成前一个阶段,才能开始下一个。阶段包括:需求分析 → 设计 → 编码 → 测试 → 维护。适用于需求稳定、技术成熟、质量要求高于速度的项目。
-
V模型:瀑布模型的变体。在开发每个阶段(如需求分析、系统设计)时,就同步规划其对应的测试阶段(如验收测试、系统测试)。适用于对正确性有严苛要求的安全关键系统。
-
原型模型:快速构建一个简化版的可运行原型,让用户直观感受并提出反馈,在此基础上开发最终产品。适用于解决 “用户不知道自己想要什么” 的问题,是探索需求的利器。
-
增量模型:先构建一个核心功能(增量1),交付给用户;再添加第二个功能(增量2),如此反复,直到整个系统完成。适用于可以分期交付、且模块相对独立的产品。
-
迭代模型:一开始只实现一个粗略的、覆盖所有功能的系统框架,然后在后续的迭代中不断细化和完善每个功能。适用于项目庞大,无法在初期确定所有细节,需要通过逐步细化来达成目标。
-
螺旋模型:每个循环包含四个阶段:制定计划 → 风险分析 → 工程实现 → 客户评估。每循环一次,系统就得到一个更完善的版本。适用于庞大、复杂且充满未知和高风险的项目。
-
敏捷模型:一种思想和框架(如Scrum, XP)。它将项目分解为一系列短周期(通常为1-4周,称为一个“Sprint”),在每个周期结束时交付一个可用的软件增量。它拥抱变化,强调团队协作和客户反馈。适用于当今互联网和软件行业的主流,尤其适合需求频繁变更、竞争激烈的市场环境。
5. 设计模式
- 观察者模式:定义了一对多的依赖关系,让多个观察者同时监听一个对象。
- 备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象。
- 策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。
- 状态模式:允许一个对象在其内部状态改变时改变它的行为。
【例】在一个气象监测系统中,天气变化会影响多种显示设备(如PC应用和手机应用)。这些设备需要及时更新。这一需求适合采用 观察者模式 进行设计。
6. 计算机组成原理
中断分类:
软件中断(C):由程序错误(如除零、非法指令)触发,CPU主动抛出异常。
硬件中断(B/D):按键输入(B)、定时器溢出(D)属于外部设备触发。
电源故障(A):系统级硬件故障,非程序逻辑引起。
