如何将中缀式转化成前缀式和后缀式

本文介绍了一种简单的中缀表达式转换为前缀和后缀表达式的方法,并通过实例详细展示了转换过程。理解不同表达式有助于更好地进行计算机科学领域的算法设计与实现。

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

35,15,+,80,70,-,*,20,/ //后缀表达方式

(((35+15)*(80-70))/20)=25 //中缀表达方式

/,*,+,35,15,-,80,70, 20 //前缀表达方式

人的思维方式很容易固定~~!正如习惯拉10进制。就对2,3,4,8,16
等进制不知所措一样~~!

人们习惯的运算方式是中缀表达式。而碰到前缀,后缀方式。。迷茫
其实仅仅是一种表达式子的方式而已(不被你习惯的方式)

我这里教你一种也许你老师都没跟你讲的简单转换方式

一个中缀式到其他式子的转换方法

这里我给出一个中缀表达式

a+b*c-(d+e)

第一步:按照运算符的优先级对所有的运算单位加括号

式子变成拉:((a+(b*c))-(d+e))
第二步:转换前缀与后缀表达式
前缀:把运算符号移动到对应的括号前面
则变成拉:-( +(a *(bc)) +(de))
把括号去掉:-+a*bc+de 前缀式子出现
后缀:把运算符号移动到对应的括号后面
则变成拉:((a(bc)* )- (de)+ )-改成:((a(bc)* )+ (de)+ )-
把括号去掉:abc*-de+- 后缀式子出现改成:abc*+de+-
发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。

如果你习惯他的运算方法。计算的时候也就是从两个操作数的前面
或者后面找运算符,而不是中间找,那么也就直接可以口算了

中缀表达换为三元(也称为前缀或逆波兰表示法)的过程是一种算法,主要用于简化表达的计算。中缀表达通常包含操作符操作数,例如 `A + B * C`。三元则将运算符置于其操作数之后,如 `* + A B C`。 这个过程被称为解析树(Parse Tree)换,步骤包括: 1. **创建一个空栈**:用于存储操作数。 2. **从左到右遍历中缀表达**: - 如果遇到数字,将其压入栈。 - 如果遇到操作符: - 如果操作符优先级高于栈顶的操作符,那么将栈顶的元素弹出,直到找到一个优先级低于当前操作符的元素或者栈为空,然后将该操作符压入栈。 - 否则,直接将当前操作符压入栈。 3. **处理结束**:如果栈不为空,意味着还有剩余的操作数未处理,将它们依次弹出并添加到结果三元末尾,用空格分隔。 以下是一个简单的C++示例,使用递归策略: ```cpp #include <stack> std::string infixToPostfix(const std::string& expr) { std::stack<char> opStack; std::string postfixExpr = ""; const char* precedence = "+-*/^"; // 定义操作符的优先级 for (char c : expr) { if (isdigit(c)) { // 数字直接添加到后缀表达 postfixExpr += c; } else if (c == '(') { // 左括号进入栈 opStack.push(c); } else if (c == ')') { // 右括号,直到左括号被匹配才出来 while (!opStack.empty() && opStack.top() != '(') { postfixExpr += opStack.pop(); } if (opStack.top() != '(') { throw "Invalid expression"; } opStack.pop(); // 出栈左括号 } else { // 操作符 while (!opStack.empty() && precedence[opStack.top()] >= precedence[c]) { postfixExpr += opStack.pop(); } opStack.push(c); // 将操作符压入栈 } } // 处理完所有字符后,将栈中的操作符全部加入后缀表达 while (!opStack.empty()) { postfixExpr += opStack.pop(); } return postfixExpr; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值