java中缀表达式转后缀表达式

package work1;
import java.util.*;



public class InffixToSuffix {
	private String []expressionCharArray;
    private List<String> newExpressionCharArray;  
    private Stack<String> stack;

    public String inffixToSuffix(String expression) {  
    	this.InitParam(expression);
    	
        for (int i = 0; i < expressionCharArray.length; i++) {  
            if ("(".equals(expressionCharArray[i])) { 
                this.dealLeftBracket(i); 
            } else if ("+".equals(expressionCharArray[i]) || "-".equals(expressionCharArray[i]) || "*".equals(expressionCharArray[i]) || "/".equals(expressionCharArray[i])) {  
                this.dealOpeartor(i);
            } else if (")".equals(expressionCharArray[i])) {  
                this.dealRightBracket(i);
            } else {  
                this.dealNormalChar(i);
            }  
        }  
        
        this.dealFinalCharsInStack();
        
        return this.stringArrayToString(newExpressionCharArray);
    }  
    
    private void InitParam(String expression){
    	expressionCharArray=this.stringToStringArray(expression);
    	newExpressionCharArray=new ArrayList<>();
    	stack=new Stack<>();
    	stack.push("@");
    }
    
    
    public boolean comparePrior(String operator1, String operator2) {  
    	if(getPrioryty(operator1)<=getPrioryty(operator2))
    		return false;
    	else
    		return true;
    }  
    
    private int getPrioryty(String operator){
    	switch (operator) {
		case "*":
		case "/":
			return 2;
		case "+":
		case "-":
			return 1;
		case "(":
			return 0;
		case "@":
			return -1;
		default:
			break;
		}
		return 0;
    }
    
    private void dealLeftBracket(int index){
    	stack.push(expressionCharArray[index]); // 如果是左括号,则入栈  
    }
    
    private void dealRightBracket(int index){
    	try{
        	this.subDealRightBracket(index);
        }
        catch(Exception e){
        	System.out.println("输入格式错误,括号不匹配!");
        	System.exit(0);
        }
    }
    
    private void subDealRightBracket(int index){
    	while (!"(".equals(stack.peek())) {  //如果是")",则出栈,一直到遇到"(" 
            String s = stack.pop();  
            newExpressionCharArray.add(s);  
        }  
        stack.pop();
    }
    
    private void dealOpeartor(int index){
    	String s = stack.pop();  
        if(comparePrior(expressionCharArray[index], s)) { //如果栈值优先级小于要入栈的值,则继续压入栈  
            stack.push(s);  
        } else {  //否则取出值  
            newExpressionCharArray.add(s);  
        }  
        stack.push(expressionCharArray[index]); 
    }
    
    private void dealNormalChar(int index){
    	newExpressionCharArray.add(expressionCharArray[index]);  
    }
    
    private void dealFinalCharsInStack(){
    	while (!"@".equals(stack.peek())) { 
            String s = stack.pop();  
            this.dealFinalCharsHaveLeftBracket(s);
            newExpressionCharArray.add(s);  
        }  
    }
    
    private void dealFinalCharsHaveLeftBracket(String s){
    	if(ifHaveLeftBracket(s)){
        	System.out.println("输入格式错误,括号不匹配!");
        	System.exit(0);
        }
    }
    
    private boolean ifHaveLeftBracket(String s){
    	if(s.equals("("))
    		return true;
    	else
    		return false;
    }
    
    private String[] stringToStringArray(String expression){
    	String[] expressionArray=new String[expression.length()];
    	for(int i=0;i<expression.length();i++){
    		char[] tempChar=new char[1];
    		tempChar[0]=expression.charAt(i);
    		expressionArray[i]=new String(tempChar);
    	}
    	return expressionArray;
    }
    
    private String stringArrayToString(List<String> expressionArray){
    	String expression="";
    	for (String expressionPart:expressionArray)
    		expression=expression+expressionPart;
    	return expression;
    }
    
    public static void main( String args[] ){
		 InffixToSuffix inffixToSuffix=new InffixToSuffix();
		 String test=new String("1*(2+8)");
		 System.out.println(inffixToSuffix.inffixToSuffix(test));
		 test="1*(2*(3-4))";
		 System.out.println(inffixToSuffix.inffixToSuffix(test));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值