package com.coding.week7; import com.coding.week6.exprNew.Operator; import com.coding.week6.exprNew.Token; import com.coding.week6.exprNew.TokenParser; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class InfixToPostfix { public static List<Token> convert(String expr) { /** 1 建立符号栈 2 顺序扫描中序表达式 a) 是数字, 直接输出 b) 是运算符 i : “(” 直接入栈 ii : “)” 将符号栈中的元素依次出栈并输出, 直到 “(“, “(“只出栈, 不输出 iii: 其他符号, 将符号栈中的元素依次出栈并输出, 直到 遇到比当前符号优先级更低的符号或者”(“。 将当前符号入栈。 3 扫描完后, 将栈中剩余符号依次输出 */ List<Token> targetTokens = new ArrayList<>(); TokenParser tokenParser = new TokenParser(); List<Token> sourceTokes = tokenParser.parse(expr); Stack<Token> operStack = new Stack<Token>(); for (Token token : sourceTokes) { if (token.isNumber()) { targetTokens.add(token); } else { //左括号 if (token.isLeftBracket()) { operStack.push(token); //右括号 } else if (token.isRightBracket()) { while (!operStack.isEmpty()) { Token t = operStack.peek(); if (t.isLeftBracket()) { operStack.pop(); break; } else { targetTokens.add(operStack.pop()); } } //普通运算符 } else { Operator oper = token.getOperator(); if (!operStack.isEmpty()) { Token t = operStack.peek(); while (!t.isLeftBracket() && !oper.hasHigherPriority(t.getOperator()) && !operStack.isEmpty()) { t = operStack.pop(); targetTokens.add(t); } } operStack.push(token); } } } //将栈中操作符全部输出 while (!operStack.isEmpty()) { targetTokens.add(operStack.pop()); } return targetTokens; } }