栈应用—中缀表达式和后缀表达式转换(原理和练习题目详解)

中缀表达式转后缀表达式
  • 规则:从左到右遍历中缀表达式的每个数字和符号,如果是数字直接写出(即成为后缀表达式的一部分);若是符号,则判断与栈顶符号的优先级,若是右括号或低于栈顶符号优先级(当是右括号时候,注意输出的只是左括号以上的符号(乘除优先于加减),那么栈顶元素依次出栈并输出,同时将当前符号进栈,一直打到最终输出为止。
后缀表达式转中缀表达式
  • 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,和符号计算后将运算结果进栈,一直获得最终结果。
例题1

9 + (3 - 1) * 3 + 10 / 2 = 20

  • 转为后缀表达式

在这里插入图片描述

所以,转换完成的后缀表达式是: 9 3 1 - 3 * + 10 2 / +

  • 转为中缀表达式
    在这里插入图片描述
例题2

中缀表达式:(70 + 30) *20 + 10 / 2 - 3 = 2002
后缀表达式: 70 30 + 20 * 10 2 / + 3 - = 2002

例题3

中缀表达式: 10 * 3 +(3-1)* 2 - 10 / 2 = 29
后缀表达式:10 3 * 3 1 - 2 * + 10 2 / - = 29

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 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中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式。 下面是一个Java实现的例子: ```java import java.util.Stack; public class InfixToPostfix { public static int getPriority(char operator) { switch (operator) { case '+': case '-': return 1; case '*': case '/': return 2; case '^': return 3; default: return 0; } } public static String infixToPostfix(String infix) { Stack<Character> stack = new Stack<>(); StringBuilder postfix = new StringBuilder(); for (int i = 0; i < infix.length(); i++) { char c = infix.charAt(i); if (Character.isDigit(c)) { postfix.append(c); } else if (c == '(') { stack.push(c); } else if (c == ')') { while (!stack.isEmpty() && stack.peek() != '(') { postfix.append(stack.pop()); } stack.pop(); } else { while (!stack.isEmpty() && getPriority(c) <= getPriority(stack.peek())) { postfix.append(stack.pop()); } stack.push(c); } } while (!stack.isEmpty()) { postfix.append(stack.pop()); } return postfix.toString(); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值