一、分支结构之switch语句
(一)基础特性与语法
-
适用场景:仅支持**整型、字符型**数据的等值匹配,无法处理区间或复杂逻辑判断。
-
核心语法要素:
-
括号内为整型或字符型表达式,用于匹配后续case值。
-
case后接整型常量或字符常量,对应匹配成功后执行的代码块。
-
break:用于结束当前switch分支,若缺失会继续执行下一个case代码(穿透现象)。
-
default:所有case均不匹配时执行,位置可灵活调整(通常放末尾)。
(二)典型应用场景
- 按日期判断状态
-
需求:1、3、5日休息,2、4、6、7日上课,输入其他数字提示无效。
-
逻辑:多个case可共用同一执行代码(如case1、3、5共用"休息"逻辑),最后用`break`结束分支。
- **简易计算器(+、-、*、/)**
-
需求:输入两个整数和一个运算符,输出计算结果,需处理除法除数为0的异常。
-
逻辑:按运算符(+、-、*、/)匹配case,除法分支中先判断除数是否为0,再执行计算或提示错误;输入无效运算符时触发`default`。
(三)与if语句的区别
-
switch:仅能做等值判断,适合固定值匹配场景,结构更清晰。
-
if:可做等值、区间、逻辑关系等复杂判断,适用范围更广。
二、循环结构
循环用于重复执行同一操作,核心包含**初始化变量、循环条件、循环操作、迭代变量**四要素。
(一)基础循环类型
- while循环
-
执行逻辑:先判断,再执行。若初始条件不满足,循环体一次都不执行。
-
适用场景:不确定循环次数,仅知道循环终止条件(如持续接收用户输入直到输入特定值)。
- do...while循环
-
执行逻辑:先执行,再判断。循环体至少执行一次,再根据条件决定是否继续。
-
适用场景:需要确保循环体至少运行一次的场景(如用户登录验证,至少让用户输入一次账号密码)。
- for循环
-
执行逻辑:先判断,再执行,将"初始化、条件、迭代"整合在同一行,结构更紧凑。
-
特性:初始化变量仅执行一次,可定义在循环内(作用域仅限循环)或循环外;循环中的两个分号不可省略。
-
适用场景:已知循环次数的场景(如遍历固定长度的数组、计算1到100的和)。
(二)循环的扩展应用
-
嵌套循环:循环内部再嵌套循环,常用于复杂场景(如打印99乘法表、打印矩形/菱形等图形)。
-
典型算法场景:通过循环实现枚举法(如百钱买百鸡问题)、斐波那契数列、韩信点兵等经典数学问题求解。
三、哈夫曼树(最优二叉树)
哈夫曼树是带权路径长度(WPL)最短的二叉树,核心用于数据压缩、编码等领域。
(一)核心概念与构建规则
-
带权路径长度(WPL):树中所有叶子节点的权值乘以其到根节点的路径长度之和,构建目标是让WPL最小。
-
构建步骤:
-
初始:将所有带权节点作为独立二叉树,按权值从小到大排序。
-
合并:每次选取权值最小的两个节点,合并为一个新节点(新节点权值为两子节点权值之和),将新节点加入集合后重新排序。
-
终止:重复合并步骤,直到集合中仅剩一个节点,该节点即为哈夫曼树的根节点。
(二)优先队列的应用
- 构建过程中,需频繁获取权值最小的节点,常用优先队列(最小堆)实现高效操作,默认按权值从小到大输出,可通过重写运算符调整排序规则。
(三)节点结构与遍历
-
节点构成:包含权值、左子节点、右子节点(可通过指针或数组下标关联)。
-
遍历方式:通常采用前序遍历,可输出树的结构及各节点的权值,辅助验证树的正确性。