大概算法思路如下:
1)如果遇到操作數(shù),我們就直接將其輸出。
2)如果遇到操作符,則我們將其放入到棧中,遇到左括號時(shí)我們也將其放入棧中。
3)如果遇到一個(gè)右括號,則將棧元素彈出,將彈出的操作符輸出直到遇到左括號為止。注意,左括號只彈出并不輸出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,從棧中彈出元素直到遇到發(fā)現(xiàn)更低優(yōu)先級的元素(或者棧為空)為止。彈出完這些元素后,才將遇到的操作符壓入到棧中。有一點(diǎn)需要注意,只有在遇到" ) "的情況下我們才彈出" ( ",其他情況我們都不會(huì)彈出" ( "。
5)如果我們讀到了輸入的末尾,則將棧中所有元素依次彈出。
簡易算法如下:
import java.util.Scanner;
import java.util.Stack;
public class MidToAfter {
public void inFixtoAfter() {
Stack<Character> s = new Stack<Character>();
String expression = "a+b*c+(d*e+f)*g=";
Character token;
int i = 0;
// Scanner sc = new Scanner(System.in);
// expression = sc.next();
while ((token = expression.charAt(i++)) != '=') {
if (token >= 'a' && token <= 'z') {
System.out.print(token + " ");
} else {
switch (token) {
case ')':
while (!s.empty() && s.peek() != '(') {
System.out.print(s.pop() + " ");
}
s.pop();
break;
case '(':
s.push(token);
break;
case '*':
case '/':
while (!s.empty() && s.peek() != '+'
&& s.peek() != '-' && s.peek() != '(') {
System.out.print(s.pop() + " ");
}
s.push(token);
break;
case '+':
case '-':
while (!s.empty() && s.peek() != '(') {
System.out.print(s.pop() + " ");
}
s.push(token);
break;
}
}
}
while (!s.empty()) {
System.out.print(s.pop() + " ");
}
System.out.println();
}
public static void main(String[] args) {
new MidToAfter().inFixtoAfter();
}
}