给你个“((5*5)+(1+(10*8+16)/(4*6)))” 通过程序输出结果

dm520 2008-09-16 10:31:26
下面是我的代码 有没有简单点的啊 ,请高手指点改正!

package test;

public class Test1 {
private String[] a = { "+", "-", "*", "/", "(", ")" };

public int outcome(String str) {
int i = 0;
int j = 0;
int sum = 0;
int m = 0;
if ((i = str.indexOf(a[4])) >= 0) {//去除括号
if(str.substring(i+1,str.substring(i+1).indexOf(a[5])).indexOf(a[4])>=0){
i=i+str.substring(i+1,str.substring(i+1).indexOf(a[5])).lastIndexOf(a[4])+1;
}
j=i+str.substring(i+1).indexOf(a[5])+1;
m = outcome(str.substring(i + 1, j));
m = outcome(str.substring(0, i) + m + str.substring(j + 1));
} else if ((i = str.indexOf(a[2])) > 0 | (j = str.indexOf(a[3])) > 0) {//乘除计算
int[] c = {};
if ((i > 0 && j <= 0) || (i > 0 && j > 0 && i < j)) {
c = b(str, i);
} else {
c = b(str, j);
}
sum = account(str, c);
m = outcome(str.substring(0, c[0]) + sum + str.substring(c[2]));
} else if ((i = str.indexOf(a[0])) > 0 | (j = str.indexOf(a[1])) > 0) {//加减计算
int[] c = {};
if ((i > 0 && j <= 0) || (i > 0 && j > 0 && i < j)) {
c = b(str, i);
} else {
c = b(str, j);
}
sum = account(str, c);
m = outcome(str.substring(0, c[0]) + sum + str.substring(c[2]));
} else {//没有符号时直接转换
m = Integer.parseInt(str);
}
return m;
}
/**
* 主要是计算指定计算符号左右的数开始和结尾
* @param str 是要计算的字符串
* @param i 计算符号的位置
* @return int[]数组是第一个是数字开始 第二个是计算符号的位置 第三个是数字结束
*/
public int[] b(String str, int i) {
int j = 0;
int n = str.length();

for (int k = 0; k < 4; k++) {
if (str.substring(0, i).lastIndexOf(a[k]) > j) {
j = str.substring(0, i).lastIndexOf(a[k]) + 1;
}
if (str.substring(i + 1).indexOf(a[k]) > 0
&& str.substring(i + 1).indexOf(a[k]) < n) {
n = str.substring(i + 1).indexOf(a[k]) + i + 1;
}
}
return new int[] { j, i, n };
}
/**
* 计算指定计算符号左右数的结果 即"6*7" 返回 42
* @param str
* @param b
* @return 计算结果
*/
public int account(String str, int[] b) {
int sum = 0;
int f1 = Integer.parseInt(str.substring(b[0], b[1]));
int f2 = Integer.parseInt(str.substring(b[1] + 1, b[2]));
if (str.charAt(b[1]) == '+') {
sum = f1 + f2;
} else if (str.charAt(b[1]) == '-') {
sum = f1 - f2;
} else if (str.charAt(b[1]) == '*') {
sum = f1 * f2;
} else if (str.charAt(b[1]) == '/') {
sum = f1 / f2;
}
return sum;
}

public static void main(String[] args) {
Test1 t = new Test1();
System.out.println(t.outcome("((5*5)+(1+(10*8+16)/(4*6)))"));
}
}
...全文
168 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yslan 2008-09-17
  • 打赏
  • 举报
回复
绑顶
dongqdonglin 2008-09-17
  • 打赏
  • 举报
回复
你根据加减乘除的优先级 搜索这些符号搜 到就 计算返回截取替换
dm520 2008-09-17
  • 打赏
  • 举报
回复
必须要用java写,因为是面试题目。
axman 2008-09-17
  • 打赏
  • 举报
回复
非常简单又通用的,可以解决所有要求语法分析的问题.

public static Integer eval(String str) throws Exception{

String s = "public class Temp{\r\n";
s += " public static Integer rt(){\r\n";
s += " return "+str+";\r\n";
s += " }\r\n";
s +="}\r\n";
File f = new File("Temp.java");
PrintWriter pw = new PrintWriter(new FileWriter(f));
pw.println(s);
pw.close();
com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
String[] cpargs = new String[] {"-d", ".\\bin","Temp.java"};
//第二个参数可以用System.getProperty("java.class.path");
//然后分隔";"找到一个结束不是jar或zip的,即只要是目录就行,把编译的类放到那里.
int status = javac.compile(cpargs);
if(status!=0){
System.out.println("没有成功编译源文件!");
return null;
}
Class c = Class.forName("Temp");
Method rt = c.getMethod("rt",null);
return (Integer)rt.invoke(null,null);

}

public static void main(String[] args) throws Exception{
System.out.println(eval("5*5+1+(10*8+16)/(4*6)"));
}
Lemon63609535 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
一定要这样做的话,楼主可以去搜搜“后缀表达式”或者“逆波兰式”,
采用栈的数据结构。反正比较麻烦,也没那么简单特别是运算符优先级
的问题。
[/Quote]
正解
Miracle1216 2008-09-17
  • 打赏
  • 举报
回复
编译原理中学习过的,以前是用C++写的,是有点麻烦,但好像也没有这么麻烦吧!
yoyo82 2008-09-17
  • 打赏
  • 举报
回复
mark

比较难的一个问题!
  • 打赏
  • 举报
回复
一定要这样做的话,楼主可以去搜搜“后缀表达式”或者“逆波兰式”,
采用栈的数据结构。反正比较麻烦,也没那么简单特别是运算符优先级
的问题。
mayuanfei 2008-09-17
  • 打赏
  • 举报
回复
用MVEL.只是Java的一个包,和JavaScript的EVAL差不多.可以直接得出结果
zhuyx808 2008-09-17
  • 打赏
  • 举报
回复
加那么多括号有什么用,不就是5*5+1+(10*8+16)/(4*6)
dashi99 2008-09-17
  • 打赏
  • 举报
回复
学习。。。当初被难倒过
zapldy 2008-09-17
  • 打赏
  • 举报
回复
我推荐你一个工具,叫antlr,专门处理文法和词法解析的。hibernate的HQL语句就是通过他实现的,我也通过它实现了很多的金融系统的指标运算公式的解析,非常好用!
shengli_liao 2008-09-16
  • 打赏
  • 举报
回复
调用JavaScipt的eval函数

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧