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

📄 exp.java

📁 JAVA培训用实用代码
💻 JAVA
字号:
public class Exp{
	public static void main(String args[]){
		String s = "-32*(17-12)+6/(4-2)";
		System.out.println(Exp.calculate(s));
	}

	public static int calculate(String s){
		//堆栈初始化
		NumberStack opnd = new NumberStack(100);
		CharStack optr = new CharStack(100);
		optr.push('#');
		s = s + '#';	
		int size = s.length();

		int i = 0;
		while(i < size){
			char c = s.charAt(i);
			String op = "";
			if((c == '#') && (optr.getTop() == '#')){
				break;
			}else if(isOperand(c)){
				while(i<size && isOperand(s.charAt(i))){
					op += s.charAt(i);	
					i++;
				}				
				opnd.push(Integer.parseInt(op));
			}else{
				char cmp = compare(optr.getTop(),c);
				switch(cmp){
					case '<':  //栈顶元素优先权低
						optr.push(c);
						i++;
						break;
					case '=':	//处理括号
						optr.pop();
						i++;
						break;
					case '>':	//栈顶元素优先权高
						char theta = optr.pop();
						int b = opnd.pop();
						int a = opnd.pop();
						opnd.push(operate(a,theta,b));
						break;
				}
			}
		}
		return opnd.getTop();
	}

	//进行四则运算
	private static int operate(int a,char t,int b){
		switch(t){
			case '+':
				return a + b;
			case '-':
				return a - b;
			case '*':
				return a * b;
			case '/':
				return a /b;
		}
		return 0;			
	}
	
	//判断是否为数字
	private static boolean isOperand(char c){
		if((c >= '0') && (c <= '9'))
			return true;
		else 
			return false;		
	}
	
	//判断是否为运算符
	private static boolean isOperator(char c){
		int i = calIdx(c);
		if(i>=0 && i<=6)
			return true;
		else 
			return false;
	}
	
	//比较运算符优先关系
	private static char compare(char c1,char c2){
		char[][] prior = {
			{'>' , '>', '<', '<', '<', '>', '>'},
			{'>' , '>', '<', '<', '<', '>', '>'},
			{'>' , '>', '>', '>', '<', '>', '>'},
			{'>' , '>', '>', '>', '<', '>', '>'},
			{'<' , '<', '<', '<', '<', '=', 'E'},
			{'>' , '>', '>', '>', 'E', '>', '>'},
			{'<' , '<', '<', '<', '<', 'E', '='},
		};
		return prior[calIdx(c1)][calIdx(c2)];		 
	}
	
	//获取运算符编号
	private static int calIdx(char c){
		switch(c){
			case '+':
				return 0;
			case '-':
				return 1;
			case '*':
				return 2;
			case '/':
				return 3;
			case '(':
				return 4;
			case ')':
				return 5;
			case '#':
				return 6;
			default:
				return -1;
		}	
	}
}

⌨️ 快捷键说明

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