括号法(万能方法)
核心思想: 先给每个运算加上括号,再把运算符挪到括号外面。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、中缀 → 后缀(括号挪后法)
步骤:
1. 给每个运算加上括号,明确运算顺序
2. 把每个运算符挪到它所在括号的后面
3. 去掉所有括号
例子:(3 + 4) × 5 - 6
第1步:加括号
还要给最后一步减号加括号:
现在整个式子就一个括号套一个括号,每个括号里只有一个运算符。
第2步:挪运算符到括号后面
* 最里面 (3 + 4) → 变成 (3 4 +)
* 中间 ( (3 4 +) × 5 ) → 变成 (3 4 + 5 ×)
* 最外面 ( (3 4 + 5 ×) - 6 ) → 变成 (3 4 + 5 × 6 -)
第3步:去掉所有括号
完成!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
另一个例子:8 - 3 + 2(注意:同级运算从左到右)
第1步:加括号
第2步:挪运算符到后面
* 先 (8 - 3) → (8 3 -)
* 再 ((8 3 -) + 2) → (8 3 - 2 +)
第3步:去括号
> 注意:如果写成 8 - (3 + 2) 结果不一样,所以括号很重要!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、中缀 → 前缀(括号挪前法)
步骤:
1. 给每个运算加上括号
2. 把每个运算符挪到它所在括号的前面
3. 去掉所有括号
例子:(3 + 4) × 5 - 6
第1步:加括号
第2步:挪运算符到括号前面
* 最里面 (3 + 4) → 变成 (+ 3 4)
* 中间 ( (+ 3 4) × 5 ) → 变成 (× + 3 4 5)
* 最外面 ( (× + 3 4 5) - 6 ) → 变成 (- × + 3 4 5 6)
第3步:去掉括号
完成!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
例子:8 - 3 + 2
第1步:加括号
第2步:挪运算符到前面
* (8 - 3) → (- 8 3)
* ((- 8 3) + 2) → (+ - 8 3 2)
第3步:去括号
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、括号法为什么好用?
1. 不用管优先级——括号已经帮你定好顺序了
2. 不用管结合性——括号让每一步都很清楚
3. 机械操作——就像做填空题,不容易错
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、完整示例对比
中缀 加括号 后缀(挪后) 前缀(挪前) 3 + 4 × 2 (3 + (4 × 2)) 3 4 2 × + + 3 × 4 2 (3 + 4) × 2 ((3 + 4) × 2) 3 4 + 2 × × + 3 4 2 10 - 2 × 3 (10 - (2 × 3)) 10 2 3 × - - 10 × 2 3 10 ÷ 2 + 3 ((10 ÷ 2) + 3) 10 2 ÷ 3 + + ÷ 10 2 3
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
五、小练习(试试看)
用括号法把 15 ÷ (3 + 2) × 4 转成后缀和前缀。
加括号: (((15 ÷ (3 + 2)) × 4)
后缀: 15 3 2 + ÷ 4 ×
前缀: × ÷ 15 + 3 2 4
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总结一句话:
先给式子加满括号,然后让运算符“搬家”——搬到括号后面是后缀,搬到括号前面是前缀,最后把括号擦掉就完事!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、后缀 → 中缀
规则
1. 从左往右扫描
2. 遇到数字:压入栈
3. 遇到运算符:弹出栈顶两个元素,后弹出的是左操作数,先弹出的是右操作数,组合成 (左 运算符 右),压回栈
4. 扫描结束,栈顶即为结果
例子:3 4 2 × + 5 -
步骤 读入 栈(栈顶在右) 操作 1 3 [3] 数字,压栈 2 4 [3, 4] 数字,压栈 3 2 [3, 4, 2] 数字,压栈 4 × [3, (4×2)] 弹出2(右)、4(左) → (4×2) 5 + [(3+(4×2))] 弹出(4×2)(右)、3(左) → (3+(4×2)) 6 5 [(3+(4×2)), 5] 数字,压栈 7 - [((3+(4×2))-5)] 弹出5(右)、(3+(4×2))(左) → ((3+4×2)-5)
结果: 3 + 4 × 2 - 5
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、前缀 → 中缀
规则
1. 从右往左扫描
2. 遇到数字:压入栈
3. 遇到运算符:弹出栈顶两个元素,先弹出的是左操作数,后弹出的是右操作数,组合成 (左 运算符 右),压回栈
4. 扫描结束,栈顶即为结果
例子:- + 3 × 4 2 5
从右往左扫描顺序:5 2 4 × 3 + -
步骤 读入 栈(栈顶在右) 操作 1 5 [5] 数字,压栈 2 2 [5, 2] 数字,压栈 3 4 [5, 2, 4] 数字,压栈 4 × [5, (4×2)] 弹出4(左)、2(右) → (4×2) 5 3 [5, (4×2), 3] 数字,压栈 6 + [5, (3+(4×2))] 弹出3(左)、(4×2)(右) → (3+4×2) 7 - [((3+4×2)-5)] 弹出(3+4×2)(左)、5(右) → ((3+4×2)-5)
结果: 3 + 4 × 2 - 5
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、规则对比
转换方向 扫描方向 弹出顺序(左操作数、右操作数) 后缀 → 中缀 从左往右 后弹出 = 左,先弹出 = 右 前缀 → 中缀 从右往左 先弹出 = 左,后弹出 = 右
核心区别: 扫描方向不同,弹出后谁当左谁当右的规则也不同,但最终组合方式都是 (左 符 右)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
前中后缀的应用
一、中缀表达式——人脑友好
我们平时写的算式,比如 3 + 4 × 2 - 5
优点:
* 符合人类阅读习惯
* 有括号、有优先级,一看就懂
缺点:
* 计算机处理麻烦(要考虑优先级、括号、结合性)
* 需要写复杂的解析程序
应用场景:
* 我们平时写的数学公式
* Excel 里的公式,比如 =A1+B2*C3
* 计算器上直接输入的算式
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、后缀表达式——计算机友好
也叫逆波兰表达式,比如 3 4 2 × + 5 -
优点:
* 不需要括号,没有优先级问题
* 计算简单:从左往右,遇到运算符就算,用栈轻松搞定
* 计算机处理特别快
缺点:
* 人类读起来费劲
应用场景:
1. 计算机计算器
很多计算器内部先把中缀转成后缀,再用栈计算。比如你按 3 + 4 × 2,计算器偷偷转成 3 4 2 × + 再算。
2. 编程语言编译
Java、Python 等语言在编译数学表达式时,会先转成后缀形式,方便生成机器码。
3. 栈的经典教学
学数据结构时,后缀表达式是栈的经典应用案例。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、前缀表达式——LISP语言友好
也叫波兰表达式,比如 - + 3 × 4 2 5
优点:
* 不需要括号
* 函数式编程语言喜欢用
缺点:
* 人类读起来最费劲
应用场景:
1. LISP 系列编程语言
LISP、Scheme、Clojure 等语言直接用前缀表达式。比如:
2. 人工智能早期语言
LISP 是 AI 领域早期的重要语言,前缀表达式就是它的语法核心。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、实际计算流程
计算机处理一个算式时,典型流程是:
举例: 你输入 (3+4)×5-6
1. 编译器转成后缀:3 4 + 5 × 6 -
2. 计算机用栈计算:
* 3、4 入栈
* 遇到 +,弹出 4 和 3,算 3+4=7,入栈
* 5 入栈
* 遇到 ×,弹出 5 和 7,算 7×5=35,入栈
* 6 入栈
* 遇到 -,弹出 6 和 35,算 35-6=29
3. 输出 29
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
五、总结对比
类型 谁喜欢用 特点 实际应用 中缀 人类 有优先级、括号,直观 日常算式、Excel 后缀 计算机 无括号,栈计算快 计算器内部、编译器 前缀 函数式编程 无括号,函数风格 LISP、AI语言
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
六、趣味小知识
* 逆波兰表达式的名字来源于波兰数学家扬·武卡谢维奇(前缀表达式是他发明的,逆波兰是后来改进的)
* 老式惠普计算器用的就是后缀表达式,输入 3 Enter 4 Enter 2 × + 这样
* 后缀表达式不需要括号,所以计算时永远不用担心优先级问题
一句话总结:
* 人类写中缀(方便看)
* 计算机算后缀(方便算)
* 函数式编程用前缀(方便写代码)