📄 exp.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 + -