中缀表达式:a+b*c
后缀表达式:abc*+
解题思路:栈
首先假设我们需要转化的中缀表达式为:
- 从左到右扫描每一个字符。如果扫描到的字符是 操作数 ,就直接输出这些操作数。
- 如果扫描到的字符是一个操作符,分三种情况:
- 如果栈空或者栈顶元素为 “ ( “,直接将操作符存储到栈中(push it)
- 栈非空但该操作符的优先级大于栈顶的操作符,就直接将操作符存储到栈中(push it)
- 栈非空但该操作符的优先级不大于栈顶的操作符,就将栈顶的操作符出栈(pop it),直到该操作符的优先级大于栈顶的操作符或者左括号或者栈空。将扫描到的操作符存储到栈中(push it)。



如果遇到的操作符是左括号“( “,直接将该操作符存储到栈中。该操作符只有在遇到右括号“ ) “的时候移除。这是一个特殊符号该特殊处理。



如果扫描到的操作符是右括号“ )”,将栈中的操作符全部导出(pop it),直到遇见左括号“( “。将栈中的左括号移出栈(pop it )。继续扫描下一个字符 。

如果输入的中缀表达式已经扫描完,但栈中仍存在操作符,此时将栈中的操作符全部导出到output 中

我的代码
遇到的小BUG:判断字符串请使用 equals() 而不是简单的 ==
public class Solution {//#中缀转后缀public static String[] MidToLRPN(String[] tokens) {List<String>ans=new ArrayList<>();Stack<String> stack=new Stack<>();//利用map快速匹配优先级Map<String,Integer> PriorityOp=new HashMap<>();PriorityOp.put("+",1); PriorityOp.put("-",1);PriorityOp.put("*",2); PriorityOp.put("/",2);for(String token:tokens){switch (token){//括号部分case "(":stack.add(token); //遇到( ,直接入栈break;case ")":while(!stack.peek().equals("(")) ans.add(stack.pop()); //将出栈至遇到(stack.pop(); //出栈 (break;//操作符部分case "+":case "-":case "*":case "/":if(stack.isEmpty()||stack.peek().equals("(")) //栈空或者栈中只有( 入栈stack.add(token);else if(PriorityOp.get(token)>PriorityOp.get(stack.peek())){stack.add(token); //栈非空,操作符优先级高于栈内元素,入栈}else {//判断顺序不可改变while(!stack.isEmpty()&&!stack.peek().equals("(")&&PriorityOp.get(token)<=PriorityOp.get(stack.peek())){ans.add(stack.pop()); //栈非空,出栈至栈空||栈顶为(||优先级大于栈顶}stack.add(token); //自身入栈}break;//数字部分:default:ans.add(token);break;}}//表达式遍历完成,将栈剩余元素导出至 ans 中while(!stack.isEmpty()) ans.add(stack.pop());return ans.stream().toArray(String[]::new);}}
