在D盘根目录下有一个input.txt的文档,里面有且只有如下两行:
a*(b+c)-d|a=2|b=3|c=4|d=5
a-b*(c+d)|a=1|b=2|c=3|d=4
要求如下:
假设该input.txt中的两行数据不需要做任何校验,例如:不需要考虑"("和")"的不对应、出现类似a--b这样的错误等等,当然这只是理想化的。现在要求把这两行的最终算数结果保存到D盘根目录下output.txt中即可。做这道题时没想到用堆栈,用的普通的通过截字符串的方法做的。大家可以说出自己的思路,用堆栈解决的或者用非堆栈解决的方法均可,最好可以附上代码,我是菜鸟,学习学习。

解决方案 »

  1.   

    这个我感觉用树的概念很清晰
    但是我具体就不会做了。a*(b+c)-d|a=2|b=3|c=4|d=5
    a-b*(c+d)|a=1|b=2|c=3|d=4
    按树的方式来说
    一:
                   -
            *        d
         a     +
             b   c
    二:
                   -
            a        *
                  b      +
                      c     d
      

  2.   

        public static void main(String[] args) throws ScriptException {  
         String[] sa = "a*(b+c)-d|a=2|b=3|c=4|d=5".split("\\|");
         for (int i = 1; i < sa.length; i++){
         sa[0] = sa[0].replaceAll(sa[i].substring(0, sa[i].indexOf("=")),sa[i].substring(sa[i].indexOf("=")+1));
         }
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");       
            System.out.println(engine.eval(sa[0]));     
        }
      

  3.   

    作业来的吧!献丑一下:/*
     * CalUsingString.java
     * 根据字符串去计算数值
     */
    package csdn.javase.algorithm;import java.io.*;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;/** 
     * @author supercodingman
     * @author http://hi.csdn.net/space-5326308.html
     * @version 1.0
     *
     */public class CalUsingString {
    //此处是为了方便省时才把所有这些JDBC资源全部都放到一个类里了,一般而言用一个专门的DBAccess类来使用才是正确的
    private String drv = "com.mysql.jdbc.Driver";
    private String url = "jdbc:mysql://localhost:3306/ec1.0";
    private String usr = "root";
    private String pwd = "1023";
    private Connection conn = null;
    private Statement stm = null;
    private ResultSet rs = null;
    List<Integer> list = new ArrayList<Integer>();

    //我是用JDBC来计算的,也可以用JS,我只是为了温习下JDBC的知识~~^_^ 初始化JDBC连接
    public void initJDBC() throws SQLException{
    try {
    Class.forName(drv).newInstance();
    conn = DriverManager.getConnection(url,usr,pwd);
    stm = conn.createStatement();
    } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    //从文件读取数据,并进行正则处理
    public void read(String inputFileName) throws IOException, SQLException{
    File inputFile = new File(inputFileName); if(inputFile.exists()){
    BufferedReader in = new BufferedReader(
    new FileReader(inputFileName));
    String s;
    try{
    while ((s = in.readLine())!= null){

    //先分割字符,然后按照后面的abcd等值把第一项表达式的字母换成数字
    String[] sp = s.trim().split("\\|");//因为java中的| 是特殊运算符,要用双斜杠

    for(int i = 1 ; i<sp.length;i++){
    sp[0] = sp[0].replaceAll(sp[i].substring(0, sp[i].indexOf("="))
    ,sp[i].substring(sp[i].indexOf("=")+1));
    }
    String sql = "select "+sp[0]+" as m;";
    System.out.println(sql);
    rs = stm.executeQuery(sql);
    while (rs.next()){
    this.list.add((rs.getInt("m")));
    }
    }
    }finally{
    //关闭资源
    in.close();
    if(stm != null){
    stm.close();
    System.out.println("Closing the Statement object...");
    }
    if(conn != null){
    conn.close();
    System.out.println("Closing the Connection object...");
    }
    }
    }else{
    System.out.println("File doesn't exist!");
    System.exit(1);
    }
    }

    //把计算结果写出文件
    public void write(String ouputFileName,List<Integer> list) throws IOException{
    PrintWriter out = new PrintWriter(
    new BufferedWriter(new FileWriter(ouputFileName)));
    try{
    for(Integer iter : list){
    System.out.println(iter);
    out.println(iter);
    }
    }
    finally{
    //记得关闭文件等资源
    out.close();
    }
    }

    //Main Method
    public static void main(String [] args){
    try {
    CalUsingString cal = new CalUsingString();
    cal.initJDBC();
    cal.read("d:\\input.txt");
    cal.write("d:\\output.txt",cal.list);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
      

  4.   


    Java数据结构和算法 解析算法表达式。
    或者 嵌入脚本ScriptEngine