c++ 中缀表达式转后缀表达式并计算值

本文介绍了中缀表达式、前缀表达式和后缀表达式之间的关系,并通过二叉树的角度理解它们。重点讲解了如何通过C++程序将中缀表达式转换为后缀表达式,并计算其值,包括解析运算符优先级和使用栈进行转换的方法。
摘要由CSDN通过智能技术生成
  1. 什么是中缀表达式, 前缀表达式, 后缀表达式?

在数据结构中, 二叉树的遍历有三种(这里不考虑分层遍历等特殊需求): 前序遍历, 中序遍历和后序遍历. 如果将表达式看做一颗二叉树, 那么中缀表达式, 前缀表达式和后缀表达式就是这三种遍历的结果.

算数表达式本身就是中缀表达式, 也就是二叉树中序遍历的结果. 关于表达式二叉树是以运算符为根, 运算值为左右叶子.
例如表达式: 2 * 5 + 6 * (7 - 8) + 6

对应的二叉树为:

那么根据中序遍历(左中右), 前序遍历(中左右), 后序遍历(左右中)的规则可以得到对应的结果:
中序遍历: 2 * 5 + 6 * (7 - 8) + 6 , 即为表达式
前序遍历: ++*25*6-786
后序遍历:25*678-*+6+

从结果来看: 使用后序遍历可以计算表达式结果, 因为值为左右孩子, 操作符为根, 而后序遍历的输出顺序为左孩子, 右孩子, 根, 这样我们就可以读取前两个数通过第三个运算符计算结果.

2.中缀表达式转前后缀表达式
网上有一种简单的方式, 通过加括号来划分他们的作用域(就是标出以运算符为根的二叉树), 其实也是利用了计算式二叉树的特性—根为运算符, 值为左右孩子, 在加括号的过程中都是以运算符为中心, 将其左右孩子画在一起,这样将运算符提到对应的括号前就是前缀表达式, 之后就是后缀表达式.

以 2 * 5 + 6 * (7 - 8) + 6为例, 根据上面的二叉树来分析:
其实我们来看表达式中的(7 - 8) 对应的就是二叉树中的右下角以’-‘为根的子树.
操作步骤:
(1) 加括号标出每个以运算符为根的二叉树, 按照运算符的优先级对所有的运算单位加括号
(((2*5) + (6 * (7 - 8))) + 6)
(2)转换前缀表达式, 把运算符号移动到对应的括号前面
++((25) (6-(78)))6)
去掉括号即为前缀表达式: ++*25*6-786
(3)转换后缀表达式, 把运算符号移动到对应的括号后面
((25)(6(78)-)+6)+
去掉括号即为后缀表达式: 25*678-*+6+

其实我个人认为这种方式虽然简单但是操作起来很容易出错, 而且还是得需要画出对应的二叉树进行验证结果的正确性, 所以某不推荐这种方式, 个人推荐直接根据表达式, 画出对应的二叉树(因为以操作符为根节点, 所以根据中缀表达式即表达式本身就可以画出二叉树), 然后前序中序遍历即可得出对应的表达式.

3 中缀表达式转后缀表达式并计算值
如何使用程序来实现中缀表达式转后缀表达式?

程序实现思路
设置一个运算符的栈stack,从左只有扫描中缀表达式

(1) 如果遇到数字,直接放到后缀表达式尾;
(2) 如果遇到遇到运算符
a:若此时栈空,则直接入栈;
b:循环:若栈stack不空且当前运算符优先级小于或等于栈顶运算符的优先级,则将栈顶运算符依次出栈,置于后缀表达式尾;
c:若栈stack不空且当前运算符优先级大于栈顶运算符优先级,则将此运算符直接入栈;
d:若当前运算符为’(‘直接入栈.
e:若当前运算符为’)’则将栈顶元素出栈置于后缀表达式尾, 直到遇到运算符’(‘, 注意’(’ 与 ‘)’不用置于后缀表达式尾;

反复执行(1), (2), 直到整个中缀表达式扫描完毕, 若此时栈stack不为空, 则将栈顶运算符依次出栈置于后缀表达式尾.

此时就可以实现将中缀表达式转换成后缀表达式.

如何根据中缀表达式来计算表示式的值?
程序思路:
(1)将后缀表达式的值依次入栈, 如果当前值为操作符, 弹出栈顶的两个元素根据操作符计算结果, 然后再将结果压入栈中.
(2)循环(1)的操作, 最终栈中剩下的值即为计算结果.

参考程序(此程序只能计算四则运算+”( )”):

#include <iostream>
#include <stack>
#include <string>
using na
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
中缀转后缀表达式的步骤如下: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右遍历中缀表达式的每个元素。 3. 如果遇到操作数(数字),则直接将其添加到输出队列中。 4. 如果遇到左括号,则将其压入栈中。 5. 如果遇到右括号,则将栈中的元素弹出,直到遇到左括号为止,并将弹出的操作符添加到输出队列中。注意,左括号不会添加到输出队列中。 6. 如果遇到操作符,则检查栈顶的操作符。如果栈顶的操作符优先级大于或等于当前操作符的优先级,则将栈顶的操作符弹出,并将其添加到输出队列中。重复此步骤直到栈顶的操作符优先级小于当前操作符的优先级,或者栈为空。然后将当前操作符压入栈中。 7. 遍历完中缀表达式后,如果栈不为空,则将栈中的操作符依次弹出,并添加到输出队列中。 8. 输出队列中的元素就是后缀表达式。 接下来,对后缀表达式进行求值的步骤如下: 1. 创建一个空的栈。 2. 从左到右遍历后缀表达式的每个元素。 3. 如果遇到操作数(数字),则将其压入栈中。 4. 如果遇到操作符,则从栈中弹出两个操作数,并根据操作符进行计算,然后将计算结果压入栈中。 5. 遍历完后缀表达式后,栈中的最后一个元素就是表达式的求值结果。 需要注意的是,对于复杂的表达式,必须按照运算符的优先级和结合性正确地进行计算
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值