package me.lzb.basic.expr; import java.util.List; import java.util.Stack; /** * 中序转后序 * Created by LZB on 2017/4/20. */ public class InfixToPostfix { private String infix; public InfixToPostfix(String infix) { this.infix = infix; } public String change() { StringBuffer sb = new StringBuffer(); List<Node> list = CalUtil.processInfixExpr(infix); Stack<Node> symbolStack = new Stack<>(); for (int i = 0; i < list.size(); i++) { Node n = list.get(i); //如果是数字,直接输出 if (n.isNumber()) { append(sb, n); continue; } //操作符部分 //操作符栈为空,操作符入栈 if (symbolStack.isEmpty()) { symbolStack.push(n); continue; } if (")".equals(n.symbol)) { //当前操作符为),输出操作数栈内的操作符,直到遇到第一个( while (!"(".equals(symbolStack.peek().symbol)) { append(sb, symbolStack.pop()); } //遇到的第一个(, 出栈,完成一个括号 symbolStack.pop(); } else { //计算用,操作符 //栈顶元素优先级更低,操作符入栈 if (CalUtil.isLowLevel(symbolStack.peek(), n) || symbolStack.peek().isLevel3()) { symbolStack.push(n); } else { //栈顶元素优先级高于等于当前操作符,输出操作符,直到遇到(,或者遇到优先级更低的操作符 while (!symbolStack.isEmpty() && !symbolStack.peek().isLevel3() && !CalUtil.isLowLevel(symbolStack.peek(), n)) { append(sb, symbolStack.pop()); } //当前操作符入栈 symbolStack.push(n); } } } while (!symbolStack.isEmpty()) { append(sb, symbolStack.pop()); } return sb.toString().trim(); } private void append(StringBuffer sb, Node node) { sb.append(" "); sb.append(node.isNumber() ? (int) node.number : node.symbol); } }