package com.coding.basic.stack.expr; import java.util.ArrayList; import java.util.List; import org.junit.Assert; import com.coding.basic.stack.Stack; public class InfixToPostfix { public static List<Token> convert(String expr) { TokenParser parser = new TokenParser(); List<Token> tokens = parser.parse(expr); List<Token> result = getPostOrder(tokens); return result; } /** * 中序表达式转后序表达式 * * @param list * @return */ private static List<Token> getPostOrder(List<Token> tokens) { List<Token> result = new ArrayList<Token>(); Stack stack = new Stack(); for (int i = 0; i < tokens.size(); i++) { // 如果为数字,加到集合里 if (tokens.get(i).isNumber()) { result.add(tokens.get(i)); } else { Token token = null; if(!stack.isEmpty()){ token = (Token)stack.peek(); } while(!stack.isEmpty() && token.hasHigherPriority(tokens.get(i))){ result.add((Token)stack.pop()); } stack.push(tokens.get(i)); } } while (!stack.isEmpty()) { // 最后看下操作符栈还有操作符没,有了加到集合末尾 result.add((Token) stack.pop()); } return result; } public static void main(String[] args) { List<Token> list = InfixToPostfix.convert("300*20+12*5-20/4"); Assert.assertEquals("[300, 20, *, 12, 5, *, +, 20, 4, /, -]", list.toString()); } }