package com.github.HarryHook.coding2017.stack.expr; import java.util.ArrayList; import java.util.List; import java.util.Stack; import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; //中序表达式: 3*20+12*5-40/2 转换成后续表达式:3 20 * 12 5 * + 40 2 / - //思路:当前token依次从左往右读取, 数字依次append, 当前入栈的运算符的优先级小于等于栈顶的运算符,栈顶操作符出栈 public class InfixToPostfix { public List<Token> convert(String expr) { TokenParser parser = new TokenParser(); List<Token> tokens = parser.parse(expr); List<Token> listOfTokens = new ArrayList<>(); Stack<Token> opsStack = new Stack<>(); for (Token token : tokens) { if (token.isNumber()) { listOfTokens.add(token); } else if (token.isOperator()) { // 还需判断当前操作符和栈顶操作符的优先级 if (opsStack.isEmpty()) { opsStack.push(token); } else { if (!token.hasHigherPriority(opsStack.peek())) { listOfTokens.add(opsStack.pop()); } opsStack.push(token); } } } while (!(opsStack.isEmpty())) { // exprStack 为空,但操作符栈还有元素 listOfTokens.add(opsStack.pop()); } return listOfTokens; } public static void main(String[] args) { InfixToPostfix toPostfix = new InfixToPostfix(); List<Token> t = new ArrayList<Token>(); String expr = "3+20+12*5+40/2"; t = toPostfix.convert(expr); System.out.println("expr: " + expr); System.out.println("PostfixExpr: " + t); } }