中序表达式转后序表达式的方法
- 遍历表达式,数字入后序表达式栈; “(”入符号栈
- 遇到 “)”;则符号栈不断弹出运算符,直到弹出 “)”
- 遇到运算符,则与符号栈栈顶运算符比较优先级,若栈顶优先级较大,则将栈顶运算符弹出并推入后序栈;否则直接推入符号栈
- 后序栈弹出并反转即为后序表达式
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
public class InfixToPostfix {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str = input.next();
Stack<Character> op = new Stack<>();
Queue<Character> postfix = new LinkedList<>();
for(int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if(ch >= '0' && ch <= '9')
postfix.add(ch);
else if(ch == '(')
op.push(ch);
else if(ch == ')') {
while((ch = op.pop()) != '(') {
postfix.add(ch);
if(op.empty())
break;
}
}
else {
if(!op.empty()) {
char top = op.peek();
if((top == '+' || top == '-' ) && (ch == '*' || ch == '/'))
op.push(ch);
else {
while(ch != '(' && top != '(' && !op.empty())
postfix.add(op.pop());
op.push(ch);
}
}else
op.push(ch);
}
}
while(!op.empty())
postfix.add(op.pop());
while(!postfix.isEmpty())
System.out.print(postfix.poll());
}
}