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 InfixToPrevfix { public static List<Token> convert(String expr) { TokenParser parser = new TokenParser(); List<Token> tokens = parser.parse(expr); return PrevOrderExpr(tokens); } public static List<Token> PrevOrderExpr(List<Token> tokens) { List<Token> result = new ArrayList<Token>(); Stack operator = new Stack(); Stack num = new Stack(); for (int i = tokens.size() - 1; i >= 0; i--) { if (tokens.get(i).isNumber()) { num.push(tokens.get(i)); } if (tokens.get(i).isOperator()) { Token token = null; if (!operator.isEmpty()) { token = (Token) operator.peek(); } while (!operator.isEmpty() && token.hasHigherPriority(tokens.get(i))) { num.push((Token) operator.pop()); } operator.push(tokens.get(i)); } } while(!operator.isEmpty()){ num.push(operator.pop()); } while (!num.isEmpty()) { result.add((Token) num.pop()); } return result; } public static void main(String[] args) { List<Token> list = InfixToPrevfix.convert("300*20+12*5-20/4"); Assert.assertEquals("[+, *, 300, 20, -, *, 12, 5, /, 20, 4]", list.toString()); } }