Java 中缀转后缀

public class Test {
	/**
	 * 一:非运算符直接输出
	 * 二:遇到左括号直接入栈
	 * 三:栈顶符号优先级高于或等于即将入栈的操作符,则将高于和等于的操作符出栈,然后再入栈
	 * 四:遇右括号,输出栈中的运算符,直到遇到第一个左括号,左括号出栈抛弃
	 * :乘除优先级相等》 加减优先级相等
	 * 
	 * 中缀转后缀实例,支持10以内加减法
	 * 
	 * */
public static void main(String[] args) {
	String s="2+2*3/((2*(1+2)-4)*5)";
	char[]chars=s.toCharArray();
	Stack stack=new Stack<>();
	ArrayList list=new ArrayList<>();
	for(int i=0;i<chars.length;i++){
		char m=chars[i];
//		System.out.println(m);
		if(m!='+'&&m!='-'&&m!='*'&&m!='/'&&m!='('&&m!=')'){
			list.add(m);
		}else{
			if(stack.isEmpty()&&m!=')'){
				stack.push(m);
			}else{
				if(m==')'){
					/**
					 * 清除一对括号
					 * */
					while((char)stack.peek()!='('){
						list.add(stack.pop());
					}
					stack.pop();
				}else if(m=='('){
					stack.push(m);	
				}else{
					popContinue(m, stack, list);//最多执行两次,除了(左括号外,栈内不会有两个连续权限相等的符号
					
				}
				
			}
		}
	}
	while(!stack.isEmpty()){
		list.add(stack.pop());
	}
	System.out.println(list.toString());
	
	Stack res=new Stack();
	for(int i=0;i<list.size();i++){
		char m=(char)list.get(i);
		if(m!='+'&&m!='*'&&m!='-'&&m!='/'){
			res.push(Double.parseDouble(m+""));
		}else{
			double d1=0,d2=0;
			if(!res.isEmpty()){
				d1=(double) res.pop();
			}
			if(!res.isEmpty()){
				d2= (double) res.pop();
			}
			
			double d3 = 0;
			if(m=='*'){
				d3=d2*d1;
			}
			if(m=='+'){
				d3=d2+d1;
			}
			if(m=='-'){
				d3=d2-d1;
			}
			if(m=='/'){
				d3=d2/d1;
			}
			res.push(d3);
			
		}
		
	}
	System.out.println(res.pop());
	
}
public static void popContinue(char m,Stack stack,ArrayList list){
	int v1=getValues(m);
	int v2=getValues((char)stack.peek());
	if(v1>v2){
		stack.push(m);
		return ;
	}else{
		list.add(stack.pop());
		if(!stack.isEmpty()){
			popContinue(m, stack, list);
			
		}else{
			stack.push(m);
		}
	}
}
public static int getValues(char m){
	int i=0;
	if(m=='*'||m=='/'){
		i=2;
	}else if(m=='('){
		i=0;
	}else{
		i=1;
	}
	return i;
}
}

posted @ 2017-06-15 14:38  清澈见底  阅读(158)  评论(0编辑  收藏  举报