本帖最后由 chaiyuan1994 于 2014-03-18 20:14:56 编辑

解决方案 »

  1.   


    自己建了个容器去实现类似栈的功能...建了个类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 的计算中。
      

  2.   

    代码给你。不过我这里定义的都是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;
    }
    }

    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;
    }
      

  3.   

    如果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);
    }
    }