package com.github.miniyk2012.coding2017.basic.stack.expr; import java.util.EmptyStackException; import java.util.LinkedList; import java.util.List; import java.util.Stack; /** * Shunting-yard algorithm * https://en.wikipedia.org/wiki/Shunting-yard_algorithm 初始化一个运算符栈和一个输出队列 不断读取token 如果token是一个数 将其放入输出队列 如果token是一个运算符o1 while栈顶部有运算符o2: 如果o1的优先级小于等于o2,把o2取出放到输出队列 最后push(o1) 将栈中的操作符逐个出栈放到输出队列 */ public class InfixToPostfix { public static List<Token> convert(String expr) { TokenParser parser = new TokenParser(); List<Token> tokens = parser.parse(expr); Stack<Token> operatorStack = new Stack<>(); List<Token> outputTokens = new LinkedList<>(); for (Token token: tokens) { if (token.isNumber()) { outputTokens.add(token); } else { while (true) { try { Token o2 = operatorStack.peek(); if (!token.hasHigherPriority(o2)) { operatorStack.pop(); outputTokens.add(o2); } else { break; } } catch (EmptyStackException e) { break; } } operatorStack.push(token); } } while (!operatorStack.isEmpty()) { outputTokens.add(operatorStack.pop()); } return outputTokens; } }