⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.java

📁 JAVA写计算器 用堆栈实现 实现了小数的加减乘除
💻 JAVA
字号:
/*****************计算器*********************
 *实现了小数的加减乘除,乘方,取模,括号
 *Write by zhangyi 2006-10*/
import java.io.*;
import java.util.Stack;
public class Calculator{
	//进栈后的优先级
	private int isp(char a){
		int x=-1;
		switch(a){
		   // case '=': x=0; break;//???
		    case '(': x=1; break;
			case '+':
			case '-': x=3; break;
			case '*':
			case '/':
			case '%': x=5; break;
			case '^': x=7; break;
			case ')': x=8; break;
			
		}
		return x;
	}
	//进栈前的优先级
	private int icp(char a){
		int x=-1;
		switch(a){
		  //  case '=': x=0; break;//???
		    case '(': x=8; break;
			case '+':
			case '-': x=2; break;
			case '*':
			case '/':
			case '%': x=4; break;
			case '^': x=6; break;
			case ')': x=1; break;
			
		}
		return x;
		
	}
	private double calculate(char op,double left,double right){
		double result=0;
		switch(op){
		case '+': result=left+right;break;
		case '-': result=left-right;break;
		case '*': result=left*right;break;
		case '/': if(right==0) System.out.println("除数为0!");
		           else result=left/right;break;
		case '%': result=left%right;break;
		case '^': result=Math.pow(left,right);break;
		}
		return result;
	}
	public void run(String exp){
		Stack<Character> s=new Stack<Character>();//存操作符
		s.push('=');
		Stack<Double> num=new Stack<Double>();//存数字
		double left,right;
		char y;
		StringBuffer line=new StringBuffer();	
		for(int i=0;i<exp.length();i++){
//			读数字
			if(Character.isDigit(exp.charAt(i))||exp.charAt(i)=='.'){
			 line.append(exp.charAt(i));
			 if(!Character.isDigit(exp.charAt(i+1))&&exp.charAt(i+1)!='.'){
			 	num.push(Double.parseDouble(line.toString()));
			 	line=new StringBuffer();
			 }
            }
			 else{//读操作符
			 	if(exp.charAt(i)=='=') break;
			 	else if(exp.charAt(i)==')')
			 	  for(y=(s.pop());y!='(';y=(s.pop())){
			 		    right=num.pop();
				 		left=num.pop();
				 		num.push(calculate(y,left,right));
			 	  }
			 	    
			 	else{
			 	for(y=s.pop();isp(y)>icp(exp.charAt(i));y=s.pop()){
			 		right=num.pop();
			 		left=num.pop();
			 		num.push(calculate(y,left,right));
			 	  }
			 	  s.push(y);s.push(exp.charAt(i));
			    }
			 }
		}
		while(s.peek()!='='){
			y=((Character)s.pop()).charValue();
			right=num.pop();
	 		left=num.pop();
	 		num.push(calculate(y,left,right));
	    }
		System.out.println(num.pop());
	}
	
	public static void main(String args[]){
		Calculator test=new Calculator();
		String line=null;
		System.out.println("键入一个表达式,以等号结尾。");
		System.out.println("如:1+(2-3)*4=");
		System.out.println("键入e结束");
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		do{
		try{			
			line=in.readLine();
			test.run(line);
		}
		catch(IOException e){
			System.out.println(e);
		}
		}while(!line.equals("e"));
		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -