栈运用之计算器

public class 栈运用_中值表达式{
						   /*--------当前运算符--------------*/
	final static char pri[][] =  // +  -   *    /   ^   !   (   )   \0*/											 
						  { 
							{'>','>','<','<','<','<','<','>','>'},			  
	/* 		+  */		    {'>','>','<','<','<','<','<','>','>'},
	/* 	栈	-  */		  	{'>','>','>','>','<','<','<','>','>'},
	/* 	顶	*  */		  	{'>','>','>','>','<','<','<','>','>'},
	/* 	运	/  */		  	{'>','>','>','>','>','<','<','>','>'},
	/* 	算	^  */		  	{'>','>','>','>','>','>',' ','>','>'},
	/* 	符	!  */		  	{'<','<','<','<','<','<','<','=',' '},
	/* 		(  */		  	{' ',' ',' ',' ',' ',' ',' ',' ',' '},
	/* 		)  */		  	{'<','<','<','<','<','<','<',' ','='}
						  };			
	/* 		\0 */	
	
	static char orderBetween ( char op1, char op2 ) //比较两个运算符之间的优先级
	 { return pri[optr2rank (op1)][optr2rank (op2)]; }
	
	private static float calcu(float pOpnd1, char op, float pOpnd2) {
		switch(op){
		case '+':return pOpnd1 + pOpnd2;
		case '-':return pOpnd1 - pOpnd2;
		case '*':return pOpnd1 * pOpnd2;
		case '/':return pOpnd1 / pOpnd2;
		case '^':return (float) Math.pow(pOpnd1, pOpnd2);
		}
		return 0;
	}

	private static float fac(float pOpnd) {
		if(pOpnd == 0)
			return 1;
		else
			return fac(pOpnd-1)*pOpnd;
	}
	
	private static float calcu(char op, float pOpnd) {
		return fac(pOpnd);
	}

	static int optr2rank ( char op ) { //由运算符转译出编号
	    switch ( op ) {
	       case '+' : return 0; //加
	       case '-' : return 1; //减
	       case '*' : return 2; //乘
	       case '/' : return 3; //除
	       case '^' : return 4; //乘方
	       case '!' : return 5; //阶乘
	       case '(' : return 6; //左括号
	       case ')' : return 7; //右括号
	       case 'm': return 8; //起始符与终止符
	       default  : System.exit ( 0 ); //未知运算符
	    }
		return -1;
		
	}
	static String readNumber(char ch[],int i){
		String s = "";
		while(Character.isDigit(ch[i])){
			s = s + ch[i];
			i++;
		}
		return s;
	}
	
	static float theMain(char ch[]){
		
		Stack<Character> StackOperator = new Stack<Character>();
		Stack<Float> StackOperand = new Stack<Float>();
		
		StackOperator.push('m');
		int i = 0;
		while(!StackOperator.isEmpty()){
			if(Character.isDigit(ch[i])){
				String s = readNumber(ch,i);
				StackOperand.push((float) (Float.valueOf(s)));
				i = i + s.length();
			}else{//              现在    栈顶
				switch(orderBetween(StackOperator.peek(),ch[i])){
				case '<':StackOperator.push(ch[i]);i++;break;
				case '=':StackOperator.pop();i++;break;
				case '>':{
					char op = StackOperator.pop();
					if('!' == op){
						StackOperator.push(ch[i]);
						float pOpnd = StackOperand.pop();
						StackOperand.push(calcu(op,pOpnd));
					}else{
						float pOpnd2 =	StackOperand.pop(),pOpnd1 = StackOperand.pop();
						StackOperand.push(calcu(pOpnd1,op,pOpnd2));
					}
					break;
				}
				default: System.exit(0);;
				}
			}		
		}	
		return StackOperand.pop();
	}
	public static void main(String args[]){
		String s = "2*(12+30)/8"+'m';	
		char ch[] = s.toCharArray();
		
		System.out.println(theMain(ch));
	}
}
发布了26 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41926640/article/details/85236786