大概算法思路如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。
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();
}
}
网友评论