package collection;
import java.util.*;
public class Exercise20_16 {
public static void main(String[] args) {
System.out.print("Enter an infix expression: ");
String expression = new Scanner(System.in).nextLine();
System.out.println(infixToPostfix(expression));
}
/** 中缀转换为后缀表达式 */
public static String infixToPostfix(String expression) {
String[] tokens = formatExpression(expression).split(" "); //返回表达式空格分隔的数组
StringBuilder postfix = new StringBuilder(tokens.length * 2); //字符串构建器(添加后缀表达式)
Stack<String> stack = new Stack<>(); //操作符栈
for (String op: tokens) {
try { //添加数字进后缀表达式
String v = String.valueOf(Double.parseDouble(op));
v = v.endsWith("0") ? String.valueOf(Integer.parseInt(op)) : v;
postfix.append(v).append(" ");
} catch (NumberFormatException ex) {
}
switch (op) { //比较操作符
case "+":
case "-":
while(!stack.isEmpty() && (stack.peek().equals("+") || stack.peek().equals("*") || stack.peek().equals("/"))) {
postfix.append(stack.pop()).append(" "); //移除优先级高的操作符
stack.push(op); //添加操作符
} stack.push(op); break;
case "*":
case "/": stack.push(op); break;
case "(": stack.push(op); break;
case ")":
while (!stack.isEmpty() && !stack.peek().equals("(")) {
postfix.append(stack.pop()).append(" "); //栈非空且栈顶不为(时,出栈
}
stack.pop(); break; //移除(
default:
}
}
//处理剩余操作符
while (!stack.isEmpty())
postfix.append(stack.pop()).append(" ");
return postfix.toString().trim();
}
/** 格式化表达式(在数字和操作符间添加一个空格) */
public static String formatExpression(String expression) {
StringBuilder builder = new StringBuilder(expression.length());
expression = expression.replaceAll(" ", "");
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(' || c == ')' || c == '+' || c == '*' || c == '/')
builder.append(" ").append(c).append(" ");
else if (Character.isDigit(c) || c == '.')
builder.append(c);
else if (c == '-') {
if (i == 1) builder.append(c);
else if (expression.charAt(i - 1) == '+' || expression.charAt(i - 1) == '-' ||
expression.charAt(i - 1) == '*' || expression.charAt(i - 1) == '/' ||
expression.charAt(i - 1) == '(')
builder.append(c);
else
builder.append(" ").append(c).append(" ");
}
}
expression = builder.toString().trim().replaceAll(" {2}", " ");
return expression;
}
}
package revision;
import java.util.Stack;
/**
* @create: 2023/10/25
* @Description:
* @FileName: Main
*/
public class Main {
public static void main(String[] args) {
// String expression = " ( 1 +2)* 3 ";
String expression = ". 1*( 1 .0+3)";
System.out.println(infixToPostfix(expression));
}
/** 中缀表达式转换为后缀 */
public static String infixToPostfix(String expression) {
if (expression.isEmpty()) return ""; // 空字符串
String[] split = format(expression).split(" "); // 格式化后按空格分隔
StringBuilder postfix = new StringBuilder(split.length << 1); // 后缀表达式
Stack<String> operator = new Stack<>(); // 操作符
for (String sign : split) {
try { // 处理数字
sign = "" + Double.parseDouble(sign);
if (sign.endsWith("0")) sign = sign.substring(0, sign.indexOf("."));
postfix.append(sign).append(" ");
continue;
} catch (NumberFormatException ignored) {}
// 处理操作符
switch (sign) {
case "+": case "-":
while (!operator.isEmpty() && operator.peek().matches("[+*/]")) {
postfix.append(operator.pop()).append(" ");
operator.push(sign);
}
operator.push(sign); break;
case "*": case "/": case "(":
operator.push(sign); break;
case ")":
while (!operator.isEmpty() && !operator.peek().equals("(")) {
postfix.append(operator.pop()).append(" ");
}
operator.pop(); break;
default:
}
}
// 处理剩余操作符
while (!operator.isEmpty()) postfix.append(operator.pop()).append(" ");
return postfix.toString().trim();
}
/** 格式化表达式 */
private static String format(String expression) {
// 在操作符两端加空格
expression = expression.replaceAll("([+\\-*/()])", " $1 ");
// 去除多余空格
expression = expression.replaceAll(" +", " ");
// 将浮点数连接在一起
expression = expression.replaceAll(" *\\. *", ".");
return expression.trim();
}
}