在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中即可。做这道题时没想到用堆栈,用的普通的通过截字符串的方法做的。大家可以说出自己的思路,用堆栈解决的或者用非堆栈解决的方法均可,最好可以附上代码,我是菜鸟,学习学习。
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中即可。做这道题时没想到用堆栈,用的普通的通过截字符串的方法做的。大家可以说出自己的思路,用堆栈解决的或者用非堆栈解决的方法均可,最好可以附上代码,我是菜鸟,学习学习。
但是我具体就不会做了。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
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]));
}
* 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();
}
}
}
Java数据结构和算法 解析算法表达式。
或者 嵌入脚本ScriptEngine