波兰表示法与逆波兰表示法(前缀、中缀、后缀表达式)

本文介绍为何要将中缀表达式转换为后缀或前缀形式,并解释了计算机如何计算这两种表达式。此外,还详细说明了从中间表达式转换为后缀或前缀表达式的算法过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、为什么要把中缀表达式转化为后缀,前缀?

计算机没法计算带有括号,以及区分优先级的表达式,或者说很难计算。使用后缀,前缀,消除了括号和优先级。

2、计算机如何计算后缀,前缀表达式?

计算后缀:从左到右遍历后缀表达式,遇到操作数,放进栈,遇到操作符,栈顶两个数出栈,进行运算,运算结果放进栈,直到读完后缀表达式。

计算前缀:从左到右遍历前缀表达式,遇到操作符,放进栈,遇到操作数,查看栈顶,栈顶为操作符,放进栈,栈顶为操作数,取出栈顶操作数和操作符,进行运算,运算后继续判断栈顶的情况。

3、中缀表达式如何转化为后缀,前缀表达式?

转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈。

转化为前缀:从右到左遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于等于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于当前操作符的操作符,当前操作符进栈。

转自:http://www.cnblogs.com/nzbbody/p/3335226.html

算法实现:http://blog.youkuaiyun.com/beiyetengqing/article/details/8066568

算法实现:http://blog.youkuaiyun.com/antineutrino/article/details/6763722

好的!以下是关于前缀表达式、中缀表达式和后缀表达式的转换原理的详细介绍。 --- ### **一、三种表达式的定义** 1. **中缀表达式** 中缀表达式是我们日常使用的数学表达形式,运算符位于两个操作数之间。例如:`A + B * C` 2. **前缀表达式** 前缀表达式将运算符放在操作数之前。例如:`+ A * B C` 3. **后缀表达式** 后缀表达式将运算符放在操作数之后。例如:`A B C * +` --- ### **二、转换的基本原则** 无论是从中缀前缀还是从后缀再到其他形式,其核心思想都基于“优先级”规则以及“栈”的数据结构辅助完成解析过程: #### 1. 运算符优先级 - `* / %` > `+ -` (乘除取模比加减高) - 括号改变计算顺序 #### 2. 栈的作用 - 使用一个栈来存储临时未处理的操作数或运算符。 - 利用栈先进后出的特点解决嵌套及优先级问题。 --- ### **三、具体转换步骤** #### **(1) 中缀转后缀 (Shunting Yard Algorithm)** 算法流程如下: 1. 初始化空栈用于存放运算符,并初始化结果列表(字符串)用于存放后缀表达式; 2. 遇到数字直接加入结果列表; 3. 如果遇到左括号 "(" ,则压入栈中; 4. 如果遇到右括号 ")" ,弹出所有栈顶元素直到遇见对应的左括号"("为止,并丢弃这对括号; 5. 若当前字符为运算符,则比较它栈顶运算符的优先级: - 当前运算符优先级高于栈顶运算符时,直接将其压入栈; - 否则不断弹出栈顶运算符并添加至结果列表,直至满足条件后再把该运算符压入栈; 6. 最终将栈内剩余的所有运算符依次弹出并放入结果列表; 示例转化过程:`A + B * C -> ABC*+` ```plaintext 输入 | 栈状态 | 输出结果 ------------------------------------- A | | A + | + | A B | + | AB * | + * | AB C | + * | ABC | + | ABC* | | ABC*+ ``` #### **(2) 中缀前缀** 基本思路是对称于上述方法: 1. 将整个中缀表达式反转; 2. 把左右括号互换位置再按照普通中缀转后缀的方式生成新的后缀序列; 3. 再次对得到的结果反向即获得最终所需的前缀表示法。 实例演示:`A+B*C => +A*BC` 先翻转变成 `(C*B)+A`, 然后按标准方式求得逆波兰式为 `CB*A+`,最后再次颠倒回来就是所期望的形式了! #### **(3) 后缀转前缀 或者 反之亦然** 此类情况需借助递归分解策略实现。通过查找每个独立单元作为整体对待进而重组为目标格式即可达成目标。 --- ### **四、总结要点** 掌握这几种常见转换技巧不仅有助于理解计算机内部如何高效地解析复杂公式,而且对于构建编译程序设计语言也有极大帮助作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值