中缀表达式: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);
}
}