免费波兰表示法转换器
输入表达式以转换或计算
支持的运算符:+、-、*、/、^、( )
数学表达式可以通过多种方式构造。最熟悉的形式,中缀表示法,将每个运算符置于两个操作数之间(例如 )。该系统依赖明确的规则——运算符优先级、结合性和括号——来指定计算顺序。相比之下,波兰表示法(前缀)和逆波兰表示法(后缀)通过将运算符分别放在操作数之前或之后,消除了这些依赖。专用的波兰表示法转换器既可作为中缀转后缀转换器、中缀转前缀转换器、前缀转中缀转换器和后缀转中缀转换器,同时也可作为逆波兰表示法计算器,对任意表示法的表达式求值。由调度场算法计算器驱动,它提供了一个完整的在线解决方案来探索这三种表示法系统。
数学表达式的构成基础
每个算术表达式由操作数(数值或符号如 或 )和运算符()组成。在中缀表示法中,运算符的运用顺序由以下决定:
- 优先级:运算符之间的等级。幂运算()最先计算,然后是乘除,最后是加减。例如,在 中,乘法先于加法执行,得到 。
- 结合性:当两个运算符优先级相同时,结合性决定分组方式。几乎所有常见的二元运算符是左结合,即从左到右分组。例如, 计算为 ,而非 。幂运算是右结合,所以 2^3^4 计算为 2^(3^4)。
- 括号(分组):括号覆盖自然的优先级和结合性,强制特定子表达式先计算。给前面的例子加上括号, 得到 。
没有这些规则,中缀表达式将是含混的。波兰表示法正是为了消除这种含混而被开发的。
波兰表示法(前缀)和逆波兰表示法(后缀)
由波兰逻辑学家扬·武卡谢维奇在 20 世纪 20 年代提出,前缀表示法将运算符写在操作数之前。中缀表达式 变为 。更复杂的表达式如 转换为 。每个运算符直接出现在其处理的两个操作数之前,因此不需要括号。
逆波兰表示法(后缀)在早期计算机中流行,将运算符放在操作数之后。同一个中缀表达式变为 。前缀和后缀都可以用栈求值:压入操作数,遇到运算符时弹出所需数量的操作数,应用运算,然后压入结果。
下面的表格使用表达式 (其中 优先级高于 )比较三种表示法:
| 表示法 | 表示 | 需要优先级规则? | 需要括号? |
|---|---|---|---|
| 中缀 | 是 | 有时 | |
| 前缀 | 否 | 否 | |
| 后缀 | 否 | 否 |
运算符优先级与结合性详情
下表总结所支持运算符的优先级和结合性:
| 运算符 | 优先级 | 结合性 |
|---|---|---|
| (幂运算) | 3(最高) | 从右到左 |
| 2 | 从左到右 | |
| 1(最低) | 从左到右 |
这些规则在表达式转换中起着关键作用,尤其是在调度场算法中。
转换算法
调度场算法:中缀转后缀
调度场算法由艾兹格·迪杰斯特拉发明,是将中缀转换为后缀的标准流程。它使用输出队列和运算符栈从左到右处理标记。
- 操作数:附加到输出。
- 运算符(O1):当栈顶运算符 O2 的优先级大于 O1 的优先级,或者当 O1 为左结合(通常情况)且优先级等于 O1 时,弹出 O2 到输出。对于右结合运算符(如幂运算),只在优先级严格大于时弹出,相等不弹出。然后将 O1 压入栈。
- 左括号:压入栈。
- 右括号:从栈弹出运算符到输出,直到遇到左括号。丢弃这两个括号。
输入结束后,将栈中剩余的运算符弹出到输出。
示例:将 转换为后缀。
| 标记 | 动作 | 输出 | 栈 |
|---|---|---|---|
| 压入栈 | ( | ||
| 输出 | 6 | ( | |
| 压入栈 | 6 | ( + | |
| 输出 | 6 2 | ( + | |
| 弹出直到 ( | 6 2 + | ||
| 压入栈 | 6 2 + | × | |
| 压入 | 6 2 + | × ( | |
| 输出 | 6 2 + 5 | × ( | |
| 压入 | 6 2 + 5 | × ( - | |
| 输出 | 6 2 + 5 3 | × ( - | |
| 弹出直到 ( | 6 2 + 5 3 − | × | |
| 结束 | 弹出 × | 6 2 + 5 3 − × |
结果为 。
中缀转前缀
中缀转前缀不那么直接,但遵循类似模式:
- 反转中缀表达式,同时将 与 互换。
- 应用调度场算法,但条件修改为:仅当栈顶运算符优先级严格大于当前运算符时才弹出(相等时不弹出)。这一修改相当于对所有运算符应用右结合的弹出规则。
- 反转最终序列,得到前缀表示法。
使用同一个表达式,反转后的中缀是 ; 经过修改算法并反转后,前缀表达式变为 。
转换回中缀
从前缀或后缀表达式还原为中缀,需要将运算符重新放置在两个操作数之间,并在必要时添加括号以保持原始顺序。
对于后缀转中缀:从左到右扫描。遇到运算符时,将前两个操作数组合成一个中缀字符串,运算符放在中间,如果所放运算符的优先级低于左或右操作数内任何已有运算符,则将结果用括号括起来。如果操作数是单个数字,则认为其优先级无限,永远不需要括号。
示例:将 (后缀)转换为中缀。
- 扫描 → 操作数。
- 扫描 → 操作数。
- 扫描 → 组合 和 为 。 的优先级低于下一个运算符,因此保留括号。
- 扫描 → 操作数。
- 扫描 → 组合 和 为 。左操作数中的 优先级低于 ,所以和的括号保持。
- 扫描 → 操作数。
- 扫描 → 操作数。
- 扫描 → 组合 和 为 。
- 扫描 → 组合 和 为 。 和 优先级相同;内部不需要额外括号。最终结果为 。
该过程同样适用于前缀(从右到左扫描并在右侧组合操作数)。
波兰表示法转换器的实际使用
在线波兰表示法转换器提供两种主要模式:
- 转换模式 – 选择四种转换之一(中缀 ↔ 前缀/后缀)。根据以下指南输入表达式:
- 中缀表达式使用标准符号,必要时加括号(例如 )。
- 前缀或后缀表达式每个标记用一个空格分隔。前缀示例:;后缀示例:。
- 计算模式 – 输入任何波兰表示法表达式(前缀或后缀),无需指定类型。工具自动检测表示法并返回计算结果。
计算器支持运算符 和幂运算 。可处理整数和小数操作数。
为什么要探索不同表示法?
尽管中缀表示法在日常数学中根深蒂固,波兰和逆波兰表示法为表达式求值提供了全新的视角。历史上,一些手持计算器使用后缀来简化内部计算,即使在今天,基于栈的虚拟机也解释后缀指令。理解如何在这些表示法之间进行转换能增强你对解析技术和算法设计的掌握——这些都是编程和计算机科学中宝贵的技能。
无论你是正在学习表达式求值的学生、实现计算器的开发者,还是探索替代数学约定的好奇者,这个波兰表示法计算器在线都提供了一种实用且交互的方式来实验中缀、前缀和后缀的转换。
常见问题
1. 转换器对前缀或后缀表达式的输入格式有什么要求?
标记(数字和运算符)必须用一个空格分隔。例如,前缀输入 "+ 3 4",后缀输入 "3 4 +"。中缀表达式可以使用标准数学符号并在需要时加括号。
2. 结合性如何影响调度场算法?
对于左结合运算符,当当前运算符与栈顶运算符优先级相同时,弹出栈顶运算符。对于右结合运算符(如幂运算),仅当栈顶运算符优先级严格更高时才弹出——相等时不触发弹出。
3. 转换器能处理幂运算吗?
是的,计算器支持幂运算(^)运算符。在转换和计算模式中,幂运算具有最高优先级和右结合性。
4. 中缀转后缀时如何处理括号?
左括号被压入运算符栈。遇到右括号时,弹出所有运算符直到遇到左括号,然后丢弃这两个括号。
5. 中缀转后缀和中缀转前缀有什么区别?
中缀转后缀使用标准调度场算法,弹出具有相等或更高优先级的运算符(左结合)。中缀转前缀需要反转输入,用更严格的弹出条件(只有严格更高的优先级)应用算法,然后反转输出。
使用方法
- 选择“转换”或“计算”模式,使用切换开关。
- 选择转换方向,或输入带有空格分隔标记的波兰表示法表达式。
- 输入时即时查看转换后的表达式或计算结果。