6 前缀、中缀、后缀表达式

本文介绍了前缀、中缀和后缀表达式及其计算方法。前缀表达式(波兰式)运算符在操作数之前,如 `- × + 3 4 5 6`。中缀表达式是日常所见的标准形式。后缀表达式(逆波兰式)运算符在操作数之后,如 `3 4 + 5 × 6 -`。后缀表达式适用于计算机求值,通过栈操作进行计算。文章还详细描述了如何将中缀表达式转换为后缀表达式的过程。

1 前缀表达式


前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前
举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6

1. 1 缀表达式的计算机求值


从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
例如: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 , 针对前缀表达式求值步骤如下:
从右至左扫描,将6、5、4、3压入堆栈
遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素),计算出3+4的值,得7,再将7入栈
接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈
最后是-运算符,计算出35-6的值,即29,由此得出最终结果

2 中缀表达式


就是人眼看到的表达式

3 后缀表达式


后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后
中举例说明: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 –

3. 1 后缀表达式的计算机求值


从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
例如: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下:

1. 从左至右扫描,将3和4压入堆栈;
2. 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈;
3. 将5入栈;
4. 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
5. 将6入栈;
6. 最后是-运算符,计算出35-6的值,即29,由此得出最终结果

3. 2 中缀表达式转换为后缀表达式

大家看到,后缀表达式适合计算式进行运算,但是人却不太容易写出来,尤其是表达式很长的情况下,因此在开发中,我们需要将 中缀表达式转成后缀表达式.
具体步骤如下:
1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;
2)从左至右扫描中缀表达式;
3)遇到操作数时,将其压s2;
4)遇到运算符时,比较其与s1栈顶运算符的优先级:
(1) 如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
(2) 否则,若优先级比栈顶运算符的高,也将运算符压入s1;
(3) 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
5) 遇到括号时:
(1) 如果是左括号“(”,则直接压入s1
(2) 如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
6)重复步骤2至5,直到表达式的最右边
7)将s1中剩余的运算符依次弹出并压入s2
8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式

在这里插入图片描述

### 前缀表达式处理技巧 前缀表达式又称波兰表达式,运算符位于操作数之前,如(3 + 4) X 5 - 6 对应前缀表达式是 - X + 3 4 5 6。计算前缀表达式时,从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果 [^1][^4]。 ### 中缀表达式处理技巧 中缀表达式是常见的运算表达式,运算符在操作数中间。中缀表达式前缀后缀表达式是常见操作。转前缀表达式时,一般需要借助栈来实现,通常是先将中缀表达式逆序,再处理运算符的优先级等规则。转后缀表达式时,可使用栈保存运算符,从左到右扫描中缀表达式,遇到操作数直接输出,遇到运算符,若栈为空或栈顶为左括号则直接入栈,若运算符优先级高于栈顶运算符则入栈,否则将栈顶运算符弹出输出,直到满足入栈条件,遇到左括号入栈,遇到右括号则将栈顶元素依次弹出输出直到遇到左括号 [^1][^3]。 ### 后缀表达式处理技巧 后缀表达式又称逆波兰表达式。计算后缀表达式时,从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素和栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。例如后缀表达式3 4 + 5 * 6 -”的计算过程就是按照此规则进行 [^1][^4]。 以下是一个计算后缀表达式的代码示例: ```python def cal_post(str): stack = [] i = 0 while i < len(str): if str[i].isdigit() or (str[i] == &#39;-&#39; and str[i + 1].isdigit()): num_str = "" if str[i] == &#39;-&#39;: num_str += str[i] i += 1 while i < len(str) and (str[i].isdigit() or str[i] == &#39;.&#39;): num_str += str[i] i += 1 stack.append(float(num_str)) elif str[i] in (&#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;): b = stack.pop() a = stack.pop() if str[i] == &#39;+&#39;: stack.append(a + b) elif str[i] == &#39;-&#39;: stack.append(a - b) elif str[i] == &#39;*&#39;: stack.append(a * b) elif str[i] == &#39;/&#39;: stack.append(a / b) i += 1 elif str[i] == &#39; &#39;: i += 1 return stack.pop() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值