自己建了个容器去实现类似栈的功能...建了个类parameter用于存储变量。 但有个问题没想明白。像下面这种输入: Input: i=10; j=21.1+i; print i,j; 如果我已经获得了 i 的值,并创建了一个parameter 对象p1:name=i;value=10; 我在读j=21.1+i 时,读到 i 处,我要怎么通过 parameter的对象name,获得它的value,并导入到 j 的计算中。
代码给你。不过我这里定义的都是int 类型的,并且只解答了一般的问题。楼主可以自己修改: 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; } }
/**本方法用来计算诸如: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; }
如果txt文本的格式是这样的话我可以投机取巧下吗,利用jdk1.6提供的脚本引擎技术。代码变得非常简单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); } }
自己建了个容器去实现类似栈的功能...建了个类parameter用于存储变量。
但有个问题没想明白。像下面这种输入:
Input:
i=10;
j=21.1+i;
print i,j;
如果我已经获得了 i 的值,并创建了一个parameter 对象p1:name=i;value=10;
我在读j=21.1+i 时,读到 i 处,我要怎么通过 parameter的对象name,获得它的value,并导入到 j 的计算中。
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;
}
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);
}
}