中綴表達式(如 1+2*3)轉後綴表達式(如 123*+)便於計算機求值。使用棧存儲運算符,掃描中綴表達式:
優先級:() 無優先級,+- 為 1,*/% 為 2,^ 為 3(右結合)。
import java.util.Stack;
public class InfixToPostfix {
static class Operator {
char ch;
int rank;
Operator(char c) {
ch = c;
if (c == '+' || c == '-') rank = 1;
else if (c == '*' || c == '/' || c == '%') rank = 2;
else if (c == '^') rank = 3;
}
}
public static String convert(String infix) {
StringBuilder sb = new StringBuilder();
Stack stack = new Stack<>();
for (char c : infix.toCharArray()) {
if (Character.isDigit(c)) {
sb.append(c);
} else {
processOperator(sb, stack, c);
}
}
while (!stack.isEmpty()) sb.append(stack.pop().ch);
return sb.toString();
}
private static void processOperator(StringBuilder sb, Stack stack, char c) {
Operator op = new Operator(c);
if (c == '(' || stack.isEmpty() || stack.peek().ch == '(') {
stack.push(op);
return;
}
if (c == ')') {
while (!stack.isEmpty() && stack.peek().ch != '(') sb.append(stack.pop().ch);
if (!stack.isEmpty()) stack.pop(); // 彈出 '('
return;
}
while (!stack.isEmpty() && stack.peek().ch != '(' && op.rank <= stack.peek().rank) {
sb.append(stack.pop().ch);
}
stack.push(op);
}
public static void main(String[] args) {
String expr = "1-2*(3^6-((9-8)*6)^2*6)-8";
System.out.println(convert(expr)); // 輸出: 1236^98-6*2^6*-*-8-
}
}
此實現支持多位數擴展(需修改掃描邏輯識別連續數字),並可輕鬆添加函數、常量支持。