中序表达式转后序

中序表达式转后序表达式的方法

  1. 遍历表达式,数字入后序表达式栈; “(”入符号栈
  2. 遇到 “)”;则符号栈不断弹出运算符,直到弹出 “)”
  3. 遇到运算符,则与符号栈栈顶运算符比较优先级,若栈顶优先级较大,则将栈顶运算符弹出并推入后序栈;否则直接推入符号栈
  4. 后序栈弹出并反转即为后序表达式
//方便起见,将后序栈改为后序队列
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());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40622253/article/details/97108759