62,614
社区成员
发帖
与我相关
我的任务
分享
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Test {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager=new ScriptEngineManager();
ScriptEngine engine=manager.getEngineByExtension("js");
String script="input:i=1;j=32/3.1+i;print i;print j;";
script=script.replaceAll("print\\s+(\\w+);","println($1);");
engine.eval(script);
}
}
public static void main(String args[]){
int i = test("1+(4+(2*1+1)+4*2)*2/2 + (1+2)");
System.out.println(i);
}
public static int test(String str){
String sub = null;
Stack <Integer> stack = new Stack <Integer>();
str = str.trim();
for(int i = 0;i<str.length();i++){
char c = str.charAt(i);
if(c == '('){
stack.push(i);
}
if(c == ')'){
int k = stack.pop();
sub = jiaANDjian(str.substring(k+1, i))+"";
str = str.substring(0,k)+ sub + str.substring(i+1,str.length());
break;
}
}
if(str.indexOf(String.valueOf('(')) == -1){
return jiaANDjian(str.trim().replaceAll(" ", ""));
}else{
return test(str);
}
}
/**本方法用来计算诸如:str = "6*7-12*2+3" 这样加减乘除全都具备的算式
* */
public static int jiaANDjian(String sub){
Stack <Integer> stack = new Stack <Integer>();
Stack <Integer> stackValue = new Stack <Integer>();
Stack<Character> stackSymbol = new Stack<Character>();
int num =0;
for(int j=0;j<sub.length();j++){
char b = sub.charAt(j);
switch(b){
case '+':
case '-':
if(stackValue.isEmpty()){
stack.push(forEasy(sub.substring(0,j)));
stackValue.push(j);
stackSymbol.push(b);
}else{
num = forEasy(sub.substring(stackValue.pop() + 1,j));
if(stackSymbol.pop() == '+'){
stack.push(num);
}else{
stack.push(0-num);
}
stackValue.push(j);
stackSymbol.push(b);
}
break;
}
}
num = forEasy(sub.substring(stackValue.pop() + 1,sub.length()));
if(stackSymbol.pop() == '+'){
stack.push(num);
}else{
stack.push(0-num);
}
num = 0;
while(!stack.isEmpty()){
num = num + stack.pop();
}
return num;
}
/*由于本段代码常常用到,故而单独抽出作为一个方法判断*/
public static int forEasy(String str){
if(str.indexOf(String.valueOf('*')) == -1 && str.indexOf(String.valueOf('/')) == -1 ){
return Integer.valueOf(str);
}else{
return chengANDchu(str);
}
}
/** 本方法用来计算用于连续的乘除运算,如sub = "1*5*4/2*6" */
public static int chengANDchu(String sub){
Stack<Character>stack2 = new Stack<Character>();
Stack<Integer>stack3 = new Stack<Integer>();
int sum = 1;
for(int j=0;j<sub.length();j++){
char b = sub.charAt(j);
switch(b){
case '*':
case '/':
if(stack2.isEmpty()){
sum = Integer.valueOf(sub.substring(0,j));
stack2.push(b);
stack3.push(j);
}else{
if(stack2.pop() == '*'){
sum = sum * Integer.valueOf(sub.substring(stack3.pop()+1,j));
}else{
sum = sum / Integer.valueOf(sub.substring(stack3.pop()+1,j));
}
stack2.push(b);
stack3.push(j);
}
break;
}
}
if(stack2.pop() == '*'){
sum = sum * Integer.valueOf(sub.substring(stack3.pop()+1,sub.length()));
}else{
sum = sum / Integer.valueOf(sub.substring(stack3.pop()+1,sub.length()));
}
return sum;
}